Heim > Backend-Entwicklung > C++ > Warum verursacht die Initialisierung von std::array mit einer Initialisierungsliste einen Kompilierungsfehler in GCC 4.6.1?

Warum verursacht die Initialisierung von std::array mit einer Initialisierungsliste einen Kompilierungsfehler in GCC 4.6.1?

DDD
Freigeben: 2024-10-29 09:51:30
Original
578 Leute haben es durchsucht

Why Does Initializing std::array with an Initialization List Cause a Compilation Error in GCC 4.6.1?

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage