繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM