consideri il codice qui sottoVS2013 inizializzazione di default vs inizializzazione valore
struct B
{
B() : member{}{};
int member[10];
};
int main()
{
B b;
}
VS2013 compilatore dà il seguente avviso:
avvertimento C4351: nuovo comportamento: gli elementi della serie 'B :: membro' saranno predefinito inizializzata 1> test.vcxproj -> C: \ Users \ asaxena2 \ documenti \ visual Studio 2013 Projects \ test \ Debug \ test.exe \
Questo è documentato here
Con C++ 11, e applicando il concetto di 'inizializzazione predefinita', significa che gli elementi di B.member non verranno inizializzate.
Ma credo che member{}
debba eseguire l'inizializzazione del valore e non l'inizializzazione predefinita. Il compilatore VS2013 è rotto?
$ 8,5/6
Per default-inizializzare un oggetto di tipo
T
significa: - seT
è un (possibilmente cv-qualificato) tipo di classe (Clausola 9), è chiamato il costruttore predefinito perT
(e l'inizializzazione è mal formata seT
non ha un costruttore predefinito accessibile);
- seT
è un tipo di matrice, ogni elemento viene inizializzato automaticamente;
- in caso contrario, non viene eseguita alcuna inizializzazione.
Se un programma richiede l'inizializzazione predefinita di un oggetto di tipoconst
-qualificatoT
,T
deve essere un tipo di classe con un costruttore predefinito fornito dall'utente.
$ 8.5.1
List-inizializzazione di un oggetto o di riferimento di tipo
T
è definito come segue:
- Se la lista di inizializzazione non ha elementi eT
è un tipo di classe con un default costruttore, l'oggetto è inizializzato a valore.
- Altrimenti, seT
è un aggregato, viene eseguita l'inizializzazione di aggregazione (8.5.1).Se nella lista ci sono meno clausole di inizializzatore di quante ne siano membri nell'aggregato, allora ciascun membro non inizializzato esplicitamente deve essere inizializzato da un elenco di inizializzazione vuoto (8.5.4). [Esempio:
struct S { int a; const char* b; int c; }; S ss = { 1, "asdf" };
inizializza
ss.a
con1
,ss.b
con"asdf"
, ess.c
con il valore di un'espressione della formaint()
, cioè,0
.esempio -end]
Questa è una buona domanda, ma "comportamento del compilatore di Visual Studio" è un titolo orribile. Considera di cambiarlo in qualcosa di più significativo. Detto questo, hai verificato il comportamento del compilatore? Potrebbe benissimo essere un avvertimento fuorviante. – hvd
@hvd: cambiato. Grazie – user3701522