Heim  >  Artikel  >  Backend-Entwicklung  >  Warum benötigt „std::array' doppelte geschweifte Klammern für die Initialisierung, während „std::vector' nur einzelne geschweifte Klammern benötigt?

Warum benötigt „std::array' doppelte geschweifte Klammern für die Initialisierung, während „std::vector' nur einzelne geschweifte Klammern benötigt?

Barbara Streisand
Barbara StreisandOriginal
2024-11-07 07:30:03509Durchsuche

Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?

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!

Stellungnahme:
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