конструктор по умолчанию итератора и инициализация члена POD - PullRequest
3 голосов
/ 11 ноября 2011

Из примера [1] в документации для boost :: iterator_facade:

class node_iterator : public boost::iterator_facade< /* ... */ >
{
 public:  node_iterator() : m_node(0) { } 
          /* ... */
 private: node_base* m_node;
};

сопровождается сноской:

Технически, стандарт C ++ почти не предъявляет никаких требований к итератору, построенному по умолчанию, поэтому, если бы мы действительно были заинтересованы в эффективности, мы могли бы написать конструктор по умолчанию, чтобы оставить m_node неинициализированным.

Мой вопрос (две части):
а) Какие требования предъявляет стандарт 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 (Примечание: хотя этот вопрос возник из примера надстройки, я считаю, что он применим к итераторам STL, поэтому я не использовал тег "надстройки".)

1 Ответ

1 голос
/ 11 ноября 2011

Почему при исключении m_node (0) избежать инициализации m_node при создании экземпляра node_iterator?

То, что вызывается конструктор по умолчанию для 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, поэтому он не инициализируется нулями ... он просто «инициализируется» любым ранее существовавшим значением в памяти в месте расположения переменнойчто делает его «неопределенным» значением, с которым оно инициализируется.

...