Heim  >  Artikel  >  Backend-Entwicklung  >  Warum benötigt std::array doppelte geschweifte Klammern für Initialisierungslisten, std::vector hingegen nicht?

Warum benötigt std::array doppelte geschweifte Klammern für Initialisierungslisten, std::vector hingegen nicht?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-07 03:40:03745Durchsuche

Why does std::array require double curly braces for initializer lists while std::vector doesn't?

Diskrepanz im C-Initialisierungslistenverhalten für std::vector und std::array

Bei der Verwendung von Initialisierungslisten für C-Container entsteht ein verblüffender Unterschied zwischen std::vector und std::array. Lassen Sie uns die Gründe für dieses Verhalten untersuchen.

Problem:

Bedenken Sie den folgenden Code:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};

Warum ist es notwendig, Double Curly zu verwenden? Klammern für std::array, aber nicht für std::vector?

Antwort:

Das Verhalten ergibt sich aus der Natur von std::array als Aggregat. Aggregate verfügen nicht über vom Benutzer deklarierte Konstruktoren, auch nicht solche, die Initialisierungslisten akzeptieren. Folglich wird die Aggregatinitialisierung für std::array durch eine Initialisierung im „alten Stil“ mit der =-Syntax durchgeführt:

std::array<int, 4> y = { { 1, 2, 3, 4 } };

In diesem alten Stil können zusätzliche geschweifte Klammern weggelassen werden, was zu dem entsprechenden Code führt:

std::array<int, 4> y = { 1, 2, 3, 4 };

Diese Klammerentfernung ist jedoch nur zulässig, wenn die Initialisierung im alten Stil mit der =-Syntax verwendet wird. Bei der direkten Listeninitialisierung, die nicht die =-Syntax verwendet, ist das Eliminieren von Klammern nicht möglich. Diese Einschränkung ist in C 11 §8.5.1/11 geregelt.

Vorgeschlagene Lösung:

Es wurde ein Fehlerbericht (CWG-Defekt Nr. 1270) erstellt, um dieses Problem zu beheben Einschränkung. Wenn der vorgeschlagene Beschluss angenommen wird, wird das Eliminieren von Klammern für alle Formen der Listeninitialisierung zulässig sein, einschließlich der folgenden:

std::array<int, 4> y{ 1, 2, 3, 4 };

Diese Änderung würde das Verhalten von std::vector und std::array konsistenter machen bei Verwendung von Initialisierungslisten.

Das obige ist der detaillierte Inhalt vonWarum benötigt std::array doppelte geschweifte Klammern für Initialisierungslisten, std::vector hingegen nicht?. 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