2010-10-14 17 views
17

Hace una hora publiqué una respuesta here que, según mi opinión, era correcta. Sin embargo mi respuesta fue downvoted por Martin B. DijoInicialización de valor y tipos no POD

Tienes suerte y estás obteniendo ceros porque la memoria en la que me colocaron pasó a cero. Esto no está garantizado por el estándar.

Sin embargo, después de leer la respuesta de Michael Burr here y tratar el siguiente código de ejemplo

1)

#include <cassert> 

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

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

me ha dado un error de depuración en MSVC++ 2010.

tengo un error similar cuando probé el siguiente código [Mi respuesta here] en 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); 
} 

Ni (1) ni (2) dio cualquier error en gcc/Clang que me hizo pensar si MSVC++ 2010 no es compatible con C++ 03. No estoy seguro.

De acuerdo con el post de Michael Burr [en C++ 03]

nuevo B() - valor inicializa B que cero inicializa todos los campos desde su ctor predeterminado se genera compilador en lugar de usuario -definido

dice The Standard

Para valor-inicializar un objeto de tipo Tmeans:

- si T es un tipo de clase (cláusula 9) con un constructor-declarado de usuario (12.1), , entonces el constructor predeterminado para T se llama (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);

.....

de otro modo, el objeto se inicializa a cero

Desde el primer momento, si no hay ningún usuario declaró constructor por defecto el compilador sintetizado constructor por defecto, que se llamará será zero initialize todos los campos (según el último punto).

Entonces, ¿dónde me equivoco? ¿Es correcta mi interpretación de la inicialización del valor?

+6

Es su compilador: 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 https://connect.microsoft.com/VisualStudio/feedback/details/100744/value-initialization-in-new-expression –

+4

@Charles: Muchas gracias por estos enlaces. Si publica ese [su comentario] como respuesta, lo aceptaré. ':)' –

+0

@Charles Bailey: Realmente, eso realmente responde la pregunta. ¿Por qué no es eso una respuesta? – sharptooth

Respuesta

32

Visual Studio tiene errores conocidos en todas las versiones actuales (2005, 2008, 2010) donde no implementa correctamente la inicialización de valor para tipos que no son POD que no tienen un constructor declarado por el usuario.

Según las reglas de idioma que ninguno de ustedes afirma debe disparar, pero sí exhibe los problemas del compilador. Estos son algunos de los informes de errores, tenga en cuenta que están todos cerrados o resueltos como "No se corregirá".

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 y ... wow, leo cuidadosamente esos artículos feeback y estoy sorprendido. En el primer fragmento de OP, el problema solo ocurrirá si hay un destructor provisto por el usuario. Si no hay un destructor proporcionado por el usuario, la variable se inicializa correctamente. Así que esto deja espacio para numerosos defectos de código y todos los desarrolladores de Visual C++ deberían ser más conscientes de este problema. – sharptooth

+0

Este es un nuevo aprendizaje para mí. También pensé que el lenguaje no proporciona ninguna garantía de inicialización. Simplemente no puedo entender qué impide que Microsoft solucione un error tan importante y básico. – Naveen

+2

@Naveenn: base de código existente. Creo que al menos deberían emitir una advertencia cada vez que no implementan las cosas correctamente (como su laxismo con la palabra clave 'typename') –

4

Para las personas que tropiezan sobre esta cuestión en 2015, como yo:

Todos los temas anteriores se han fijado en VS 2015. Valor de inicialización ahora funciona como se define en el estándar.

Cuestiones relacionadas