[英]iterator default constructor and POD member initialization
来自boost :: iterator_facade文档中的示例[1]:
class node_iterator : public boost::iterator_facade< /* ... */ >
{
public: node_iterator() : m_node(0) { }
/* ... */
private: node_base* m_node;
};
随后是一个脚注:
从技术上讲,C ++标准对默认构造的迭代器几乎没有要求,所以如果我们真的关心效率,我们可以编写默认构造函数来保持m_node未初始化。
我的问题(两部分):
(a)C ++标准对默认构造的迭代器有什么要求?
(b)为什么要在实例化node_iterator
时省略m_node(0)
避免初始化m_node
? 那么m_node
不会被默认初始化(因此零初始化)吗?
[1] http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/iterator_facade.html#constructors-and-data-members(nb :虽然这个问题起源于一个提升示例,但我相信它适用于STL迭代器,因此我没有使用“boost”标签。)
为什么要在实例化node_iterator时省略m_node(0)以避免初始化m_node?
仅仅因为调用node_iterator
的默认构造函数并不意味着类本身的非静态数据成员已正确初始化,特别是如果没有为这些数据成员指定初始化。 这包括从构造函数初始化列表中省略那些非静态数据成员。 此外, m_node
是一个指针,因此是一个POD类型,因此它没有一个默认构造函数,可以在进入node_iterator
本身的构造函数体之前调用它来构造对象。 因此,从初始化列表中省略m_node
将避免专门初始化m_node
data_member。
那么m_node不会被默认初始化(因此零初始化)吗?
根据C ++ 03规范,第8.5 / 9节,如果没有为该对象指定初始化程序,则使用“indeterminant”值初始化非静态对象(也包括类的非静态数据成员)。 如果非静态对象是非POD类类型和/或const限定类型,则仅对其进行默认初始化。 在这种情况下, m_node
是一个指针类型,因此它是一个POD类型,所以它不是零初始化的...它只是用变量位置的内存中的任何预先存在的值“初始化”,因此使它成为一个初始化的“不确定”值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.