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 を初期化しないままにするデフォルト コンストラクタを記述できます。

私の質問 (2 つの部分):
(a) C++ 標準は、デフォルトで構築された反復子にどのような要件を課していますか?
(b) をインスタンス化するときに除外すると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 に答える