Klasseninterne Memberinitialisierung mit einer Initialisierungsliste unter Verwendung einer einheitlichen Initialisierungssyntax?[doppelt]
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.
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.