Информация об изменениях

Сообщение Re[2]: Вопрос по value-initialization от 16.05.2017 7:39

Изменено 16.05.2017 7:47 N. I.

Re[2]: Вопрос по value-initialization
rumit7:

R>Разве пример приведенный здесь не описывает Ваш случай?


R>
R>struct A
R>{
R>    int i;
R>    A() { } // user-provided default ctor, does not initialize i
R>};

В его случае у A нет user-declared или user-provided конструкторов.

To value-initialize an object of type T means:
....
— if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;

К non-static data member p применяется

To value-initialize an object of type T means:
....
— otherwise, the object is zero-initialized

и дальше

To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;

Нулевое значение будет либо скопировано из A().p в a.p копирующим конструктором A, либо присвоено a.p непосредственно за счёт value-initialization (если произошло copy elision, из-за которого объекты A() и a сливаются в один).
Re[2]: Вопрос по value-initialization
rumit7:

R>Разве пример приведенный здесь не описывает Ваш случай?


R>
R>struct A
R>{
R>    int i;
R>    A() { } // user-provided default ctor, does not initialize i
R>};

В его случае у A нет user-declared или user-provided конструкторов. Начиная с C++03 (где понятие value-initialization впервые появилось), p должно быть проиницилизировано соответствующим нулевым значением:

To value-initialize an object of type T means:
....
— if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;

К non-static data member p применяется

To value-initialize an object of type T means:
....
— otherwise, the object is zero-initialized


и дальше

To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;


Нулевое значение будет либо скопировано из A().p в a.p копирующим конструктором A, либо присвоено a.p непосредственно за счёт value-initialization (если произошло copy elision, из-за которого объекты A() и a сливаются в один).