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 von std::array< int, N >
ist ein trivialer Konstruktor, der absolut nichts tut.
Syntax wie std::array< int, 3 >()
oder std::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:
Ein Objekt vom Typ T wertinitialisieren bedeutet:
- Wenn T ein (möglicherweise lebenslaufqualifizierter) Klassentyp ohne einen vom Benutzer bereitgestellten oder gelöschten Standardkonstruktor ist, wird das Objekt mit Null initialisiert. Wenn T einen nicht trivialen Standardkonstruktor hat, wird das Objekt standardmäßig initialisiert.
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.)
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?
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 dies sizeof (std::array< X, 0 >)
nicht Null ist.
T x[N]
Syntax.