Inizializzazione dei membri in classe con un elenco di inizializzatori utilizzando la sintassi di inizializzazione uniforme?[duplicato]
Domanda
Sto cercando di compilare quanto segue con MSVC2013:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
}
Il compilatore mi dà il seguente errore: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.
Se cambio il codice in questo:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{{false, false, false}};
}
il programma compila e funziona bene.È un problema con il compilatore o non capisco la sintassi?Da quello che ho letto, la prima versione dovrebbe compilare.
Soluzione
Ecco la grammatica responsabile da 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
Quindi direi che la prima affermazione è corretta ed è effettivamente accettata da
un recente gcc
e clang
.
Altri suggerimenti
Se mettere il punto e virgola siccome è richiesto
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
};
quindi sembra che sia un bug del compilatore MS VC++ 2013.Almeno il codice è compilato con successo in www.ideone.com.
Structire SomeStruct è un aggregato e dovrebbe essere inizializzato utilizzando un elenco di inizializzatori.