Verwendung von std::array mit Initialisierungslisten: Ein Compiler-Rätsel
Während die Syntax für die Verwendung von Initialisierungslisten mit std::array scheinbar erscheint Da die Implementierung zwar unkompliziert ist, sind einige Benutzer auf Schwierigkeiten gestoßen. Das in der Frage bereitgestellte Beispiel:
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };</code>
führt zu einem Kompilierungsfehler in GCC 4.6.1 aufgrund eines unerwarteten Tokens vor dem Komma. Diese Inkonsistenz mit dem Verhalten von std::vector, das Initialisierungslisten ohne Probleme akzeptiert, hat zu Verwirrung und Spekulationen über die Gültigkeit der Syntax geführt.
Eintauchen in die Natur von std::array
Um diese Diskrepanz zu verstehen, ist es wichtig, die Definition von std::array zu untersuchen:
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
Wie aus dieser Definition hervorgeht, ist std::array im Wesentlichen eine Struktur, die umschließt ein Array. Es fehlt ein Konstruktor, der eine Initialisierungsliste direkt akzeptiert. Nach den Regeln von C 11 gilt std::array jedoch als Aggregat. Dies ermöglicht eine Aggregatinitialisierung, bei der die Elemente des Arrays indirekt initialisiert werden.
Das Syntaxrätsel überwinden
Um ein std::array mithilfe der Aggregatinitialisierung erfolgreich zu initialisieren, Es ist ein zusätzlicher Satz geschweifter Klammern erforderlich:
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
Durch die Verschachtelung der geschweiften Klammern erkennt der Compiler die Absicht, die Elemente des Arrays innerhalb der Struktur zu initialisieren. Dadurch wird der beim ersten Beispiel aufgetretene Kompilierungsfehler beseitigt.
GCC-Fehler oder Standardunregelmäßigkeiten?
Interessanterweise impliziert der C-Standard, dass die zusätzlichen Klammern hier weggelassen werden könnten konkreter Fall. Daher ist es wahrscheinlich, dass in GCC 4.6.1 ein Fehler auftritt, der die ordnungsgemäße Interpretation der vereinfachten Syntax verhindert.
Das obige ist der detaillierte Inhalt vonWarum verursacht die Initialisierung von std::array mit einer Initialisierungsliste einen Kompilierungsfehler in GCC 4.6.1?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!