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
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!