Inizializzazione dei membri in classe con un elenco di inizializzatori utilizzando la sintassi di inizializzazione uniforme?[duplicato]

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

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top