Я дуже заплутаний щодо значення- та за замовчуванням та нульової ініціалізації. і особливо коли вони застосовують різні стандарти C ++ 03 та C ++ 11 (і C ++ 14 ).
Я цитую і намагаюся викласти справді хорошу відповідь Value- / Default- / Zero- Init C ++ 98 і C ++ 03 тут, щоб зробити це більш загальним, оскільки це допомогло б багатьом користувачам, якби хтось міг допомогти заповнити потрібні прогалини, щоб мати хороший огляд того, що відбувається коли?
Повне розуміння на прикладах у двох словах:
Іноді пам'ять, повернута новим оператором, буде ініціалізована, а іноді це не залежить від того, чи тип, який ви створюєте, - це POD (звичайні старі дані) , чи це клас, який містить елементи POD і використовує сформований компілятором конструктор за замовчуванням.
- У C ++ 1998 існує 2 типи ініціалізації: нульова та за замовчуванням ініціалізація
- У C ++ 2003 було додано 3-й тип ініціалізації, значення-ініціалізація .
- У C ++ 2011 / C ++ 2014 було додано лише ініціалізацію списку, а правила для ініціалізації значення / за замовчуванням / нуль трохи змінені.
Припустимо:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
У компіляторі C ++ 98 має відбуватися таке :
new A
- невизначене значення (A
дорівнює POD)new A()
- нульова ініціалізаціяnew B
- конструкція за замовчуванням (B::m
неініціалізована,B
не є POD)new B()
- конструкція за замовчуванням (B::m
неініціалізована)new C
- конструкція за замовчуванням (C::m
нульова ініціалізація,C
не є POD)new C()
- конструкція за замовчуванням (C::m
нульова ініціалізація)new D
- конструкція за замовчуванням (D::m
неініціалізована,D
не є POD)new D()
- конструкція за замовчуванням? (D::m
неініціалізовано)
У компіляторі відповідності C ++ 03 все повинно працювати так:
new A
- невизначене значення (A
дорівнює POD)new A()
- значення-ініціалізаціяA
, що є нульовою ініціалізацією, оскільки це POD.new B
- за замовчуванням ініціалізується (залишаєB::m
неініціалізованим,B
не є POD)new B()
- значення ініціалізуєтьсяB
яке нульовим чином ініціалізує всі поля, оскільки його за замовчуванням ctor створюється компілятором на відміну від визначеного користувачем.new C
- за замовчуванням ініціалізуєтьсяC
, що викликає за замовчуванням ctor. (C::m
ініціалізується нулем,C
не є POD)new C()
- значення-ініціалізуєтьсяC
, що викликає за замовчуванням ctor. (C::m
нульова ініціалізація)new D
- конструкція за замовчуванням (D::m
неініціалізована,D
не є POD)new D()
- значення ініціалізує D? , який викликає ctor за замовчуванням (D::m
неініціалізований)
Курсивні значення та? є невизначеності, будь ласка, допоможіть це виправити :-)
У компіляторі відповідності C ++ 11 речі повинні працювати так:
??? (будь ласка, допоможіть, якщо я почну тут, це все одно піде не так)
У компіляторі відповідності C ++ 14 все повинно працювати так: ??? (будь ласка, допоможіть, якщо я почну тут, це все одно піде не так) (проект на основі відповіді)
new A
- за замовчуванням ініціалізуєтьсяA
, компілятор gen. ctor, (залишкиA::m
неініціалізовані) (A
є POD)new A()
- значення-ініціалізуєтьсяA
, що є нульовою ініціалізацією з 2. точки в [dcl.init] / 8new B
- за замовчуванням ініціалізуєтьсяB
, компілятор gen. ctor, (залишкиB::m
неініціалізовані) (B
не є POD)new B()
- значення-ініціалізує,B
яке нульовим чином ініціалізує всі поля, оскільки його за замовчуванням ctor створюється компілятором на відміну від визначеного користувачем.new C
- за замовчуванням ініціалізуєтьсяC
, що викликає за замовчуванням ctor. (C::m
нульова ініціалізація,C
не є POD)new C()
- значення-ініціалізуєтьсяC
, що викликає за замовчуванням ctor. (C::m
ініціалізується нулем)new D
- за замовчуванням ініціалізуєтьсяD
(D::m
неініціалізований,D
не є POD)new D()
- значення-ініціалізуєтьсяD
, що викликає типовий ctor (D::m
неініціалізований)new E
- за замовчуванням ініціалізуєтьсяE
, що викликає комп. ген. ctor. (E::m
неініціалізовано, E не є POD)new E()
- значення-ініціалізуєтьсяE
, яке нульовим чином ініціалізуєтьсяE
з 2 точки в [dcl.init] / 8 )new F
- за замовчуванням ініціалізуєтьсяF
, що викликає комп. ген. ctor. (F::m
неініціалізовано,F
не є POD)new F()
- значення-ініціалізуєтьсяF
, яке за замовчуванням ініціалізуєтьсяF
з 1. точки в [dcl.init] / 8 (F
функція ctor надається користувачем, якщо вона оголошена користувачем, а не є явно встановленою за замовчуванням або видалена в першій декларації. Посилання )