c++ visual-c++ initialization value-initialization

c++ - Inicialización de valor y tipos no POD



visual-c++ initialization (2)

Para las personas que tropiezan con esta pregunta en 2015, como yo:

Todos los problemas anteriores se han solucionado en VS 2015. La inicialización del valor ahora funciona según lo definido en la norma.

Hace una hora publiqué una respuesta que, según yo, era correcta. Sin embargo mi respuesta fue downvoted por Martin B. Él dijo

Eres afortunado y obtienes 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 aquí y probar el siguiente código de ejemplo

1)

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

Obtuve un error de depuración en MSVC ++ 2010.

Obtuve un error similar cuando probé el siguiente código [Mi respuesta aquí ] 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) dieron ese error en gcc / Clang, lo que me hizo pensar si MSVC ++ 2010 no es compatible con C ++ 03. No estoy seguro.

De acuerdo con la publicación de Michael Burr [en C ++ 03]

new B () - value-initializes B que inicia cero todos los campos ya que su ctor predeterminado es el compilador generado en oposición a definido por el usuario.

El estándar dice

Para inicializar el valor de un objeto de tipo Tmeans:

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

.....

de lo contrario, el objeto tiene cero inicialización

Desde el primer punto si no hay un usuario declarado constructor por defecto, se llamará al constructor por defecto sintetizado por el compilador que zero initialize todos los campos (según el último punto).

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


Visual Studio ha detectado errores 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 del lenguaje, ninguno de ustedes afirma que deba 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