来自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)为什么在实例化m_node(0)
时遗漏m_node
避免初始化node_iterator
?那么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”标记。)
答案 0 :(得分:1)
在实例化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节,如果没有为初始化程序指定初始值,则使用“不确定”值初始化非静态对象(也包括类的非静态数据成员)那个对象。如果非静态对象是非POD类类型和/或const限定类型,则仅对其进行默认初始化。在这种情况下,m_node
是一个指针类型,因此它是一个POD类型,因此它不是零初始化的...它只是“初始化”了内存位置的任何预先存在的值。变量,从而使它成为一个“不确定”的值,用它初始化。