Heim > Backend-Entwicklung > C++ > Warum erfordert „std::array' doppelte geschweifte Klammern in Initialisierungslisten?

Warum erfordert „std::array' doppelte geschweifte Klammern in Initialisierungslisten?

Barbara Streisand
Freigeben: 2024-11-08 05:07:01
Original
487 Leute haben es durchsucht

Why Does `std::array` Require Double Curly Braces in Initializer Lists?

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}};
Nach dem Login kopieren

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 } };
Nach dem Login kopieren

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 };
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage