Inizializzazione del valore e tipi di Non POD

Un’ora fa ho postato una risposta che, secondo me, era corretta. Tuttavia la mia risposta è stata downvoted da Martin B. Egli ha detto

Sei solo fortunato e stai prendendo zeri perché la memoria in cui sono stato inserito è stata inizializzata a zero. Questo non è garantito dallo standard.

Tuttavia dopo aver letto la risposta di Michael Burr qui e provare il seguente codice di esempio

1)

#include  struct B { ~B(); int m; }; int main() { B * b = new B(); assert(b->m == 0); } 

Ho ricevuto un errore di debug su MSVC ++ 2010.

Ho ricevuto un errore simile quando ho provato il seguente codice [La mia risposta qui ] su MSVC ++ 2010

2)

 #include  struct Struct { std::string String; int Int; bool k; // add add add }; struct InStruct : Struct { InStruct() : Struct() {} }; int main() { InStruct i; assert(ik == 0); } 

(1)(2) fornito alcun errore di questo tipo su gcc / Clang che mi ha fatto pensare se MSVC ++ 2010 non supporta C ++ 03. Non sono sicuro.

Secondo il post di Michael Burr [in C ++ 03]

nuovo B () – valore-inizializza B che azzera-inizializza tutti i campi poiché il suo ctor predefinito è compilatore generato in contrapposizione a definito dall’utente.

Lo standard dice

Per inizializzare il valore di un object di tipo Tmeans:

– se T è un tipo di class (clausola 9) con un costruttore dichiarato dall’utente (12.1), allora viene chiamato il costruttore predefinito per T (e l’inizializzazione è mal formata se non esiste un costruttore predefinito accessibile);

…..

in caso contrario, l’object viene inizializzato a zero

Dal primo punto se non c’è un costruttore dichiarato dall’utente predefinito verrà chiamato il costruttore predefinito sintetizzato del compilatore, che zero initialize tutti i campi (secondo l’ultimo punto).

Quindi dove sbaglio? La mia interpretazione dell’inizializzazione del valore è corretta?

Visual Studio ha rilevato bug in tutte le versioni correnti (2005, 2008, 2010) in cui non implementa correttamente l’inizializzazione del valore per i tipi non POD che non dispongono di un costruttore dichiarato dall’utente.

Secondo le regole del linguaggio, nessuno di voi afferma che dovrebbe sparare ma mostrare i problemi del compilatore. Questi sono alcuni dei bug report, si noti che sono tutti chiusi o risolti come “Non risolverà”.

http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization

http://connect.microsoft.com/VisualStudio/feedback/details/484295/vc-does-not-value-initialize-members-of-derived-classs-without-user-declared-constructor

http://connect.microsoft.com/VisualStudio/feedback/details/100744/value-initialization-in-new-expression

Per le persone che incappano in questa domanda nel 2015, come me:

Tutti i problemi sopra riportati sono stati risolti in VS 2015. L’inizializzazione del valore ora funziona come definito nello standard.