Unterschied im Verhalten der Initialisiererliste in std::vector und std::array
In C ist das Verhalten der initializer_list für std::vector und std::array unterscheidet sich erheblich. Betrachten Sie die folgenden Codeausschnitte:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
Warum benötigt std::array doppelte geschweifte Klammern, während std::vector nur einfache geschweifte Klammern erfordert?
Erklärung
std::vector verfügt über einen benutzerdefinierten Konstruktor, der eine std::initializer_list als Argument verwendet. Dies ermöglicht eine direkte Listeninitialisierung mit einzelnen geschweiften Klammern.
Andererseits ist std::array ein Aggregattyp, der keine benutzerdefinierten Konstruktoren hat. Stattdessen wird die Aggregatinitialisierung verwendet, eine von C geerbte Funktion. Die Aggregatinitialisierung ermöglicht die Initialisierung mit doppelten geschweiften Klammern.
Die ältere Syntax für die Aggregatinitialisierung mit Klammern und dem =-Zeichen ist ebenfalls gültig:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
Diese Syntax ermöglicht jedoch in bestimmten Fällen das Eliminieren von Klammern, was für die direkte Listeninitialisierung mit std::array nicht zulässig ist. Eine Fußnote im C-Standard (C 11 §8.5.1/11) besagt, dass „geschweifte Klammern bei anderen Verwendungen der Listeninitialisierung nicht weggelassen werden können.“
Fehlerbericht und vorgeschlagene Lösung
Ein Fehlerbericht (CWG-Fehler Nr. 1270) wurde eingereicht, um diese Einschränkung zu beheben. Wenn die vorgeschlagene Lösung angenommen wird, ist das Eliminieren von Klammern für die direkte Initialisierung der std::array-Liste zulässig, sodass Folgendes gültig ist:
std::array<int, 4> y{ 1, 2, 3, 4 };
Das obige ist der detaillierte Inhalt vonWarum benötigt „std::array' doppelte geschweifte Klammern für die Initialisierung, während „std::vector' nur einzelne geschweifte Klammern benötigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!