2010-10-14 9 views
17

Un'ora fa ho inviato una risposta here che secondo me era corretta. Tuttavia la mia risposta è stata downvoted da Martin B. Ha dettoInizializzazione del valore e tipi Non POD

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 here e cercando il seguente codice di esempio

1)

#include <cassert> 

struct B { ~B(); int m; }; 

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

ho ottenuto un errore di debug MSVC++ 2010.

ho avuto un errore simile quando ho provato il seguente codice [La mia risposta here] su MSVC++ 2010

2)

#include <cassert> 
struct Struct { 
    std::string String; 
    int Int; 
    bool k; 
    // add add add 
}; 

struct InStruct : Struct 
{ 
    InStruct() : Struct() {} 
}; 

int main() 
{ 
    InStruct i; 
    assert(i.k == 0); 
} 

(1)(2) ha dato un tale errore 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]

nuova B() - valore inizializza B che zero inizializza tutti i campi dalla sua ctor di default è compilatore generato al contrario di utente -defined.

dice Lo Standard

Per valore-inizializzare un oggetto di tipo Tmeans:

- se T è un tipo di classe (clausola 9) con un costruttore user-dichiarata (12.1), quindi il costruttore predefinito per T è chiamato (e l'inizializzazione è mal formata se non è un costruttore predefinito accessibile);

.....

altrimenti, l'oggetto viene inizializzato a zero

Dal primo punto, se non v'è alcun utente dichiarato costruttore di default il compilatore sintetizzato costruttore di default che sarà chiamato zero initialize tutti i campi (in base all'ultimo punto).

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

+6

È il tuo compilatore: 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-classes-without-user-declaration-constructor https://connect.microsoft.com/VisualStudio/feedback/details/100744/value-initialization-in-new-expression –

+4

@Charles: Grazie mille per questi collegamenti. Se pubblichi [il tuo commento] come risposta, lo accetto. ':' –

+0

@Charles Bailey: Davvero, questo in realtà risponde alla domanda. Perché non è una risposta? – sharptooth

risposta

32

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 hanno un costruttore dichiarato dall'utente.

Secondo le regole del linguaggio, nessuno di voi asserisce che deve attivare 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-classes-without-user-declared-constructor

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

+1

+1 e ... wow, ho letto con attenzione in questi pezzi di ricambio e sono scioccato. Nel primo frammento di OP il problema si verifica solo se esiste un distruttore fornito dall'utente. Se non esiste un distruttore fornito dall'utente, la variabile viene inizializzata correttamente. Quindi questo fa spazio a numerosi difetti di codice e tutti gli sviluppatori sane di Visual C++ dovrebbero essere meglio a conoscenza di questo problema. – sharptooth

+0

Questo è un nuovo apprendimento per me. Pensavo anche che il linguaggio non fornisse alcuna garanzia di inizializzazione. Non riesco a capire cosa impedisce a Microsoft di correggere un bug così importante e di base. – Naveen

+2

@Naveenn: codice esistente. Penso che dovrebbero almeno emettere un avvertimento ogni volta che non implementano le cose correttamente (come il loro lassismo con la parola chiave 'typename') –

4

Per le persone che inciampare su questa domanda nel 2015, come me:

Tutte le questioni di cui sopra sono stati corretti in VS 2015. Valore di inizializzazione ora funziona come definito nello standard.