Default, value, und null-Initialisierung Durcheinander

Ich bin sehr verwirrt darüber, Wert- & Standard- & null-Initialisierung.
und vor allem, wenn Sie kick für die verschiedenen standards C++03 und C++11 (und C++14).

Ich bin zitiert und versucht zu verlängern, eine wirklich gute Antwort Wert-/Standard-/Zero - Init C++98 und C++03 hier zu machen, mehr Allgemeine als würde es helfen, eine Menge von Nutzern, wenn jemand helfen könnte, füllen Sie die benötigten Lücken zu haben, die einen guten überblick über das, was passiert, wenn?

Den vollen Einblick durch Beispiele in aller Kürze:

Manchmal die Erinnerung zurück durch den new-operator initialisiert werden, und manchmal ist es nicht abhängig davon, ob der Typ, den Sie newing-up ist ein POD (plain old data), oder wenn es eine Klasse, die enthält POD Mitglieder und ist die Verwendung eines compiler-erzeugten default-Konstruktors.

  • In C++1998 es gibt 2 Arten der Initialisierung: null- und default-Initialisierung
  • In C++2003 eine 3. Art der Initialisierung Wert-Initialisierung Hinzugefügt wurde.
  • In C++2011/C++2014 nur Liste-Initialisierung wurde Hinzugefügt, und die Regeln für Wert-/Standard-/null-Initialisierung ein wenig verändert.

Übernehmen:

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 */

In einem C++98-compiler, der sollte Folgendes auftreten:

  • new A - unbestimmten Wert (A ist POD)
  • new A()- null-initialisieren
  • new B - Standard-Konstrukt (B::m nicht initialisiert ist, wird B ist nicht-POD)
  • new B() - Standard-Konstrukt (B::m ist nicht initialisierten)
  • new C - Standard-Konstrukt (C::m ist null initialisiert, C ist nicht-POD)
  • new C() - Standard-Konstrukt (C::m ist null initialisiert)
  • new D - Standard-Konstrukt (D::m nicht initialisiert ist, wird D ist nicht-POD)
  • new D() - Standard-Konstrukt? (D::m ist nicht initialisierten)

In ein C++03-konforme compiler, die Dinge sollten funktionieren etwa so:

  • new A - unbestimmten Wert (A ist POD)
  • new A() - Wert initialisieren A, die null-Initialisierung, da es ein POD.
  • new B - default-initialisiert (Blätter B::m initialisierten, B ist nicht-POD)
  • new B() - Wert initialisiert B dem null-initialisiert alle Felder, weil seine default-ctor compiler generiert, im Gegensatz zu Benutzer-definiert.
  • new C - default-initialisiert C fordert die default-ctor. (C::m ist null initialisiert, C ist nicht-POD)
  • new C() - Wert initialisiert C fordert die default-ctor. (C::m ist null initialisiert)
  • new D - Standard-Konstrukt (D::m nicht initialisiert ist, wird D ist nicht-POD)
  • new D() - Wert initialisiert D?, das ruft die default-ctor (D::m ist nicht initialisierten)

Kursive Werte und ? sind Unsicherheiten, bitte helfen Sie, um dies zu korrigieren 🙂

In eine C++11-konformer compiler, die Dinge sollten funktionieren etwa so:

??? (bitte helfen Sie, wenn ich starten Sie hier es wird sowieso schief gehen)

In einer C++ - 14-konforme compiler, die Dinge sollten funktionieren etwa so:
??? (bitte helfen Sie, wenn ich starten Sie hier es wird sowieso schief gehen)
(Entwurf basiert auf Antwort)

  • new A - default-initialisiert A compiler-gen. ctor, (leavs A::m nicht initialisierten) (A ist POD)
  • new A() - Wert initialisiert A, die null-Initialisierung-seit 2. Punkt in [dcl.init]/8

  • new B - default-initialisiert B compiler-gen. ctor, (leavs B::m nicht initialisierten) (B ist nicht-POD)

  • new B() - Wert initialisiert B dem null-initialisiert alle Felder, weil seine default-ctor compiler generiert, im Gegensatz zu Benutzer-definiert.
  • new C - default-initialisiert C fordert die default-ctor. (C::m ist null initialisiert, C ist nicht-POD)
  • new C() - Wert initialisiert C fordert die default-ctor. (C::m ist null initialisiert)
  • new D - default-initialisiert D (D::m nicht initialisiert ist, wird D ist nicht-POD)
  • new D() - Wert initialisiert D fordert die default-ctor (D::m ist nicht initialisierten)
  • new E - default-initialisiert E fordert die comp. gen. ctor. (E::m nicht initialisiert ist, E ist nicht-POD)
  • new E() - Wert initialisiert E, die null-initialisiert E seit dem 2. Punkt in [dcl.init]/8 )
  • new F - default-initialisiert F fordert die comp. gen. ctor. (F::m nicht initialisiert ist, wird F ist nicht-POD)
  • new F() - Wert initialisiert F, die default-initialisiert F seit dem 1. Punkt in [dcl.init]/8 (F ctor Funktion ist Benutzer-sofern Sie für die Benutzer-erklärt und nicht explizit vorgegeben oder gelöscht " auf seiner ersten Erklärung. Link)
  • es gibt eine gute Erklärung gibt es hier: en.cppreference.com/w/cpp/language/default_constructor
  • Soweit ich sagen kann, es gibt nur einen Unterschied zwischen C++98 und C++03 in diesen Beispielen. Das Problem scheint zu sein, beschrieben in N1161 (dort sind die späteren überarbeitungen des Dokuments) und CWG DR #178. Die Formulierung muss geändert werden, in C++11 durch neue Funktionen und eine neue Spezifikation der POD, und es wieder in C++ - 14 aufgrund von Mängeln in der C++11-Wortlaut, aber die Auswirkungen sind in diesen Fällen nicht geändert.
  • Während langweilig struct D { D() {}; int m; }; Wert sein kann, einschließlich in der Liste.
InformationsquelleAutor Gabriel | 2015-04-21
Schreibe einen Kommentar