Habe std::array
ich unter C ++ 11 die Garantie, dass die Syntax std::array<T, N> x;
standardmäßig alle Elemente des Arrays initialisiert?
BEARBEITEN : Wenn nicht, gibt es eine Syntax, die für alle Arrays (einschließlich Arrays mit der Größe Null) funktioniert, um alle Elemente auf ihren Standardwert zu initialisieren?
EDIT : auf cppreference , sagt die Standardkonstruktors Beschreibung:
(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array
Die Antwort kann also ja sein. Aber ich möchte sicher sein, dass dies dem Standard oder dem zukünftigen Standard entspricht.
T x[N]
Syntax.Antworten:
Standardmäßig ist die Standardinitialisierung die Initialisierung, die erfolgt, wenn keine andere Initialisierung angegeben wird. Die C ++ - Sprache garantiert Ihnen, dass alle Objekte, für die Sie keinen expliziten Initialisierer angeben, standardmäßig initialisiert werden (C ++ 11 §8.5 / 11). Das schließt Objekte vom Typ
std::array<T, N>
und einT[N]
.Beachten Sie, dass es Typen gibt, für die die Standardinitialisierung keine Auswirkung hat und der Wert des Objekts unbestimmt bleibt: alle Nicht-Klassen- und Nicht-Array-Typen (§8.5 / 6). Folglich hat ein standardmäßig initialisiertes Array von Objekten mit solchen Typen einen unbestimmten Wert, z.
Sowohl das Array im c-Stil als auch
std::array
sind mit Ganzzahlen mit unbestimmtem Wert gefüllt, ebenso wieplain_int
mit unbestimmtem Wert.Ich vermute, wenn Sie "zu ihrem Standardwert" sagen, meinen Sie wirklich "alle Elemente initialisieren auf
T{}
". Dies ist keine Standardinitialisierung , sondern eine Wertinitialisierung (8.5 / 7). Sie können die Wertinitialisierung in C ++ 11 ganz einfach anfordern, indem Sie jeder Deklaration einen leeren Initialisierer geben:Dadurch werden alle Array-Elemente nacheinander wertinitialisiert, was dazu führt
plain_old_int
, dass alle Mitglieder beider Arten von Arrays auf Null initialisiert werden.quelle
boost::value_initialized
Link, aber ich glaube, VC12 (VS2013) hat jetzt eine viel bessere Unterstützung.Die Standardinitialisierung ist ein Begriff aus dem Standard, der möglicherweise überhaupt keine Initialisierung bedeutet. Sie meinen also wahrscheinlich eine Nullinitialisierung .
Die Beschreibung auf cppreference.com ist eigentlich etwas irreführend.
std::array
ist eine aggregierte Klasse, und wenn der Elementtyp primitiv ist, ist es POD: "einfache alte Daten", wobei die Semantik eng mit der C-Sprache übereinstimmt. Der implizit definierte Konstruktor vonstd::array< int, N >
ist ein trivialer Konstruktor, der absolut nichts tut.Syntax wie
std::array< int, 3 >()
oderstd::array< int, 3 > x{}
, die Nullwerte liefern, tun dies nicht durch Aufrufen eines Konstruktors. Erste Nullen ist Teil der wert Initialisierung , angegeben in C ++ 11 §8.5 / 8:std::array
hat keinen vom Benutzer bereitgestellten Standardkonstruktor, daher wird er mit Null initialisiert. Es verfügt über einen implizit definierten Standardkonstruktor, ist jedoch trivial und wird daher niemals standardmäßig initialisiert. (Dies macht jedoch keinen Unterschied, da eine triviale Initialisierung per Definition zur Laufzeit keine Auswirkung hat.)Arrays im C-Stil
std::array
sind beide Aggregate, und die Möglichkeit, Aggregate vollständig auf Null zu initialisieren, liegt in der Syntax= {}
. Dies funktioniert seit C ++ 98. Beachten Sie, dass Arrays im C-Stil keine Ausdehnung von Null haben können und dass diessizeof (std::array< X, 0 >)
nicht Null ist.quelle
Beide
T x[N];
undstd::array<T, N> x;
standardmäßig initialisieren jedes Element des Arrays.Wenn beispielsweise,
T = std::string
ist jedes Element eine leere Zeichenfolge. WennT
es sich um eine Klasse ohne Standardkonstruktor handelt, können beide nicht kompiliert werden. WennT = int
, hat jedes Element einen unbestimmten Wert (es sei denn, diese Deklaration befindet sich zufällig im Namespace-Bereich).quelle
Zunächst initialisiert T x [N] die Elemente standardmäßig, obwohl die Standardinitialisierung eines Skalartyps T tatsächlich nichts bewirkt. Das Obige gilt auch für std :: array x. Ich denke, was Sie brauchen, ist eine Listeninitialisierung.
quelle