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::vectorx{1,2,3,4}; std::array 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 von C geerbten Funktion.
Bei der Aggregatinitialisierung im „alten Stil“ werden das Gleichheitszeichen und Doppelpunkte verwendet:
std::arrayy = { { 1, 2, 3, 4 } };
Bei Verwendung der direkten Listeninitialisierung (eingeführt in C 11), this = 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::arrayy{ 1, 2, 3, 4 };
Abschließend ist der Unterschied in Das Verhalten zwischen std::vector und std::array mit Initialisierungslisten ergibt sich aus ihren grundlegenden Eigenschaften als Klasse mit benutzerdefinierten Konstruktoren bzw. als Aggregat, das auf der Aggregatinitialisierung basiert. Damit std::array den Regeln der Aggregatinitialisierung entspricht, sind doppelte geschweifte Klammern erforderlich, während std::vector eine direkte Initialisierung mit einem einzigen Satz von Klammern ermöglicht, ohne auf die altmodische Aggregatinitialisierungssyntax angewiesen zu sein.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3