Verhalten der Initialisiererliste: Unterschiede in std::vector und std::array
Während std::vector und std::array sind Bei beiden Containern in C unterscheidet sich ihr Verhalten mit Initialisierungslisten. In diesem Artikel untersuchen wir die Feinheiten der Aggregatinitialisierung und verstehen, warum doppelte geschweifte Klammern für std::array erforderlich sind.
Betrachten Sie den folgenden Codeausschnitt, der einen std::vector und einen std: initialisiert: array:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
std::vector Initialisierung
std::vector unterstützt benutzerdefinierte Konstruktoren, einschließlich solcher, die eine std::initializer_list akzeptieren. Daher können wir x direkt mit geschweiften Klammern initialisieren, ohne dass zusätzliche geschweifte Klammern erforderlich sind.
std::array-Initialisierung
Im Gegensatz zu std::vector, std::array ist ein Aggregat, das keine benutzerdefinierten Konstruktoren hat. Stattdessen basiert es auf der Aggregatinitialisierung, einer Funktion, die von C geerbt wurde.
Bei der Aggregatinitialisierung im „alten Stil“ werden das Gleichheitszeichen und Doppelpunkte verwendet:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
Bei Verwendung von direkt Listeninitialisierung (eingeführt in C 11), diese Syntax ist nicht mehr gültig. Darüber hinaus ist die Eliminierung von Klammern, die das Weglassen zusätzlicher Klammern ermöglicht, nur in Deklarationen mit der alten Syntax „style =“ zulässig. Für die direkte Listeninitialisierung sind zusätzliche geschweifte Klammern obligatorisch.
CWG-Defekt
Ein CWG-Defektbericht (CWG-Defekt Nr. 1270) zielt darauf ab, diese Einschränkung zu beheben, indem das Eliminieren von Klammern ermöglicht wird andere Formen der Listeninitialisierung. Bei Übernahme wäre der folgende Code wohlgeformt:
std::array<int, 4> y{ 1, 2, 3, 4 };
Zusammenfassend lässt sich sagen, dass der Unterschied im Verhalten zwischen std::vector und std::array mit Initialisierungslisten auf ihre grundlegenden Eigenschaften als Klasse mit zurückzuführen ist benutzerdefinierte Konstruktoren bzw. ein Aggregat, das auf der Aggregatinitialisierung basiert. Für std::array sind doppelte geschweifte Klammern erforderlich, um den Regeln der Aggregatinitialisierung zu entsprechen, während std::vector eine direkte Initialisierung mit einem einzigen Satz von Klammern ermöglicht, ohne auf die altmodische Aggregatinitialisierungssyntax angewiesen zu sein.
Das obige ist der detaillierte Inhalt vonWarum erfordert „std::array' doppelte geschweifte Klammern in Initialisierungslisten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!