Я дуже заплутаний щодо значення- та за замовчуванням та нульової ініціалізації. і особливо коли вони застосовують різні стандарти 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 надається користувачем, якщо вона оголошена користувачем, а не є явно встановленою за замовчуванням або видалена в першій декларації. Посилання )