Klasseninterne Memberinitialisierung mit einer Initialisierungsliste unter Verwendung einer einheitlichen Initialisierungssyntax?[doppelt]

StackOverflow https://stackoverflow.com//questions/24035388

Frage

Ich versuche Folgendes mit MSVC2013 zu kompilieren:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
}

Der Compiler gibt mir den folgenden Fehler: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

Wenn ich den Code dazu ändere:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

das Programm kompiliert und läuft einwandfrei.Ist das ein Problem mit dem Compiler oder verstehe ich die Syntax nicht?Nach dem, was ich gelesen habe, sollte die erste Version kompiliert werden.

War es hilfreich?

Lösung

Hier ist die verantwortliche Grammatik von N3797:

// after a member declaration:
braced-or-equal-initializer-list:
  = initializer-clause
  braced-init-list

braced-init-list:
  { initializer-list ,OPT }
  { }

initializer-list:
  initializer-clause
  initializer-list, initializer-clause

initializer-clause:
  assignment-expression
  braced-init-list

Also würde ich sagen, die erste Aussage ist richtig und wird tatsächlich von akzeptiert ein kürzlich gcc und clang.

Andere Tipps

Wenn Semikolons so zu platzieren sind, wie es erforderlich ist

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
};

dann scheint es sich um einen Fehler des MS VC ++ 2013-Compilers zu handeln.Zumindest ist der Code erfolgreich kompiliert bei www.ideone.com .

Structire SomeStruct ist ein Aggregat und sollte mit einer Initialisierungsliste initialisiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top