Warum das abweichende Verhalten von std::Vector- und std::Array-Initialisierungslisten?
Bei der Initialisierung von Objekten beider std::vector und std::array-Datenstrukturen in C gibt es einen deutlichen Unterschied in ihrer Syntax. std::vectors können mit geschweiften Klammern initialisiert werden, wie in:
std::vector<int> x{1,2,3,4};
Bei std::arrays sind jedoch doppelte geschweifte Klammern erforderlich:
std::array<int, 4> y{{1,2,3,4}};
Der Grund denn diese Diskrepanz ergibt sich aus der zugrunde liegenden Natur dieser Datenstrukturen. std::arrays sind Aggregate – Objekte ohne benutzerdefinierte Konstruktoren oder auch nur einen, der explizit eine std::initializer_list annimmt.
Die Initialisierung mit geschweiften Klammern für std::arrays fällt daher unter Aggregatinitialisierung, geerbt von C. Bei der Aggregatinitialisierung wird der „alte Stil“ mit =: verwendet:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
Diese Syntax ermöglicht die Eliminierung zusätzlicher Klammern in „einer Deklaration des Formulars“. T x = { a };". Diese Regel erstreckt sich jedoch nicht auf andere Formen der Listeninitialisierung, einschließlich der im zweiten Codeausschnitt verwendeten.
Ein CWG-Fehlerbericht (#1270) verdeutlicht diese Einschränkung. Sollte die vorgeschlagene Lösung angenommen werden, wird die Eliminierung von Klammern auf andere Listeninitialisierungsformen ausgeweitet, wodurch möglicherweise die folgende Syntax gültig wird:
std::array<int, 4> y{ 1, 2, 3, 4 };
Das obige ist der detaillierte Inhalt vonWarum erfordern „std::vector' und „std::array' unterschiedliche Initialisierungssyntaxen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!