iterator默认构造函数和POD成员初始化

时间:2011-11-11 01:34:27

标签: c++ iterator default-constructor

来自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”标记。)

1 个答案:

答案 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类型,因此它不是零初始化的...它只是“初始化”了内存位置的任何预先存在的值。变量,从而使它成为一个“不确定”的值,用它初始化。