Типы инициализации по умолчанию C ++

Почему эти два сценария (инициализация A и C) дают разные результаты инициализации по умолчанию в C ++ 14? Я не могу понять результат на основе правил инициализации по умолчанию в cppreference.com

struct A { int m; };
struct C { C() : m(){};  int m; };  

int main() {
  A *a, *d;
  A b;
  A c{};
  a=new A();
  d=new A;
  cout<<a->m<<endl;
  cout<<d->m<<endl;
  cout<<b.m<<endl;
  cout<<c.m<<endl;
  cout<<"--------------------"<<endl;
  C *a1, *d1;
  C b1;
  C c1{};   
  a1=new C();
  d1=new C;
  cout<<a1->m<<endl;
  cout<<d1->m<<endl;
  cout<<b1.m<<endl;
  cout<<c1.m<<endl;
 }

Вывод:

(Scenario 1)
    0 
    -1771317376
    -1771317376
    0
    --------------------
(Scenario 2)
    0
    0
    0
    0

Сообщение, которое пытается объяснить это (но мне еще не ясно, почему разница в результатах и ​​что вызывает инициализацию m в каждом сценарии): Беспорядок по умолчанию, значение и нулевой инициализации


person darkThoughts    schedule 24.07.2017    source источник
comment
Не могли бы вы указать страницу cppreference.com, на которую вы ссылаетесь?   -  person Johnathan Gross    schedule 25.07.2017
comment
ваше имя так сбивает с толку   -  person bolov    schedule 25.07.2017
comment
@JohnathanGross Я обновил исходный пост, добавив ссылку на пост, в котором цитируются соответствующие части из cppreference   -  person darkThoughts    schedule 25.07.2017
comment
a и c - примеры инициализации значения (которая обнуляет все). b и d - это примеры инициализации по умолчанию, которая ничего не делает для тривиально конструируемых типов, таких как A   -  person Cubbi    schedule 25.07.2017


Ответы (1)


A не имеет определяемых пользователем конструкторов, поэтому был создан конструктор по умолчанию. C имеет определяемый пользователем конструктор, поэтому нет гарантии, что конструктор по умолчанию был сгенерирован, тем более что определяемый пользователем конструктор перегружает конструктор по умолчанию. Почти наверняка каждая конструкция языка C использовала пользовательский конструктор.

В определяемом пользователем конструкторе для C используется список инициализации для значения инициализации C::m. Когда C::m инициализируется, это инициализируется значение, которое включает нулевую инициализацию.

new A; и A b; - инициализации по умолчанию. Это не устанавливает присвоение каких-либо значений их членам. Какое значение хранится в A::m, является неопределенным поведением.

new A(); и A c{}; - это инициализации значений. Как часть инициализации значения, он выполняет инициализацию нуля.

person Johnathan Gross    schedule 24.07.2017
comment
C имеет определяемый пользователем конструктор, поэтому нет гарантии, что конструктор по умолчанию был сгенерирован. На самом деле есть гарантия, что конструктор по умолчанию не будет сгенерирован неявно. - person bolov; 25.07.2017