Default-Initialisierung std::array?
Mit C++11 std::array
, habe ich die Garantie, dass die syntax std::array<T, N> x;
wird default-initialisiert alle Elemente des Arrays ?
BEARBEITEN: wenn nicht, gibt es eine syntax, die funktioniert auf allen arrays (einschließlich zero-size-arrays) initialisiert alle Elemente auf Ihren Standardwert?
BEARBEITEN: auf cppreference, den default-Konstruktor Beschreibung sagt:
(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array
also die Antwort kann ja sein. Aber ich möchte sicher sein, dass nach der standard-oder der zukünftige standard.
Denke nicht so. Es ist Standard deklariert, es ist also im Grunde das äquivalent zu den
T x[N]
syntax.InformationsquelleAutor Vincent | 2013-08-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Per definition, default-Initialisierung ist die Initialisierung, die Auftritt, wenn keine andere Initialisierung angegeben ist; die Sprache C++ garantiert Ihnen, dass alle Objekt, für das Sie nicht eine explizite Initialisierung, wird default-initialisiert (C++11 §8.5/11). Das beinhaltet Objekte von Typ
std::array<T, N>
undT[N]
.Sich bewusst sein, dass es Arten gibt, für die Standard-Initialisierung hat keinen Effekt und lässt das Objekt den Wert unbestimmt: jede nicht-Klasse der nicht-array-Typ (§8.5/6). Folglich wird ein default-initialisiert ein array von Objekten mit solchen Typen haben unbestimmten Wert, z.B.:
Sowohl die c-Stil-array und
std::array
sind gefüllt mit ganzen zahlen unbestimmten Wert, genauso wieplain_int
hat den unbestimmten Wert.Ich vermute, dass, wenn Sie sagen, "Ihre default-Wert" Sie wirklich meinen "initialisieren Sie alle Elemente zu
T{}
". Das ist nicht default-Initialisierung, es ist Wert-Initialisierung (8.5/7). Sie können auf Anfrage Wert-Initialisierung ganz einfach in C++11, indem jede Erklärung ein leeres Initialisierer:Die Wert-initialisieren Sie alle array-Elemente in turn, was in
plain_old_int
, und alle Mitglieder der beiden Arten von arrays, wird auf null initialisiert.Nach dem standard, ja es tut. Vorsicht Fehler in MSVC, es nicht zu implementieren einigen Fällen der Wert der Initialisierung korrekt.
in der Tat steigern Sie so sagt und Abhilfe es mit Ihren
boost::value_initialized
link, aber ich glaube VC12 (VS2013) hat eine viel bessere Unterstützung jetzt.Macht mich wünschte, das comitee verändert die standard-default-Wert-Initialisierung und untergraben value-at-Anfrage. Ie std::array<int, 12> = {std::unbestimmt}; oder so
In der Praxis was bedeutet es sogar zu initialisieren etwas zu einem unbestimmten Wert? Was ist die alternative?
InformationsquelleAutor Casey
Default-Initialisierung ist ein Begriff aus der Standard potenziell Bedeutung keine Initialisierung, also du meinst wohl null-Initialisierung.
In der Beschreibung an cppreference.com ist eigentlich ein bisschen irreführend.
std::array
ist ein Aggregat-Klasse, und wenn Sie den element-Typ ist primitiv, es ist POD: "plain old data", mit der Semantik eng passend die C-Sprache. Die implizit definierten Konstruktorstd::array< int, N >
ist ein trivial eine, die tut absolut nichts.Syntax wie
std::array< int, 3 >()
oderstd::array< int, 3 > x{}
die gelöschte Werte nicht so tun, durch aufrufen eines Konstruktors. Immer Nullen ist Teil Wert-Initialisierung, angegeben in C++11 §8.5/8:std::array
hat keine vom Benutzer bereitgestellte default-Konstruktor, so wird es null initialisiert. Es hat eine implizit definierte Standardkonstruktor, aber es ist trivial, so ist es nie default-initialisiert. (Aber das macht keinen Unterschied, da triviale Initialisierung per definition hat keine Auswirkung zur Laufzeit.)C-style-arrays und
std::array
sind beide Aggregate, und die Art und Weise komplett auf null initialisieren jedes Aggregat ist mit der syntax= {}
. Dies funktioniert, da C++98. Beachten Sie, dass die C-style-arrays nicht null Umfang, und dasssizeof (std::array< X, 0 >)
ist nicht null.InformationsquelleAutor Potatoswatter
Beide
T x[N];
undstd::array<T, N> x;
default-initialisiert jedes element des array.Zum Beispiel, wenn
T = std::string
, jedes element wird ein leerer string sein. WennT
ist eine Klasse ohne einen default Konstruktor, wird das kompilieren fehlschlagen. WennT = int
jedes element unbestimmten Wert (es sei denn, die Erklärung geschieht, werden im namespace-Gültigkeitsbereich)InformationsquelleAutor Cubbi
Zunächst T x[N] ist default-Initialisierung der Elemente, obwohl die default-Initialisierung einer skalaren Typ T eigentlich gar nichts. Das obige gilt auch für std::array x. Ich denke, was Sie brauchen, ist die Liste der Initialisierung.
InformationsquelleAutor Lingxi