3

来自 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) 为什么在实例化 a 时省略m_node(0)避免初始化?那么无论如何都不会被默认初始化(因此为零初始化)? m_nodenode_iteratorm_node

[1] http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/iterator_facade.html#constructors-and-data-members (注:虽然这个问题源于一个提升的例子,但我相信它适用于 STL 迭代器,因此我没有使用“boost”标签。)

4

1 回答 1

1

为什么在实例化 node_iterator 时省略 m_node(0) 会避免初始化 m_node?

仅仅因为 a 的默认构造函数node_iterator被调用并不意味着类本身的非静态数据成员被正确初始化,特别是如果没有为这些数据成员指定初始化。这包括从构造函数初始化列表中省略那些非静态数据成员。此外,m_node是一个指针,因此是一个 POD 类型,因此它没有一个默认构造函数,在进入构造函数的主体之前,它不会被调用来构造对象node_iterator。因此m_node,从初始化列表中省略将避免专门初始化m_nodedata_member。

无论如何, m_node 不会被默认初始化(因此为零初始化)吗?

根据 C++03 规范第 8.5/9 节,如果没有为该对象指定初始化程序,则使用“不确定”值初始化非静态对象(还包括类的非静态数据成员)。非静态对象仅在它是非 POD 类类型和/或 const 限定类型时才被默认初始化。在这种情况下m_node是指针类型,因此是 POD 类型,所以它不是零初始化的……它只是用内存中变量位置的任何预先存在的值“初始化”,从而使它是初始化的“不确定”值。

于 2011-11-11T01:43:42.230 回答