Estoy muy confundido sobre el valor, el valor predeterminado y la inicialización cero. y especialmente cuando entran en juego para los diferentes estándares C ++ 03 y C ++ 11 (y C ++ 14 ).
Estoy citando y tratando de extender una respuesta realmente buena Value- / Default- / Zero- Init C ++ 98 y C ++ 03 aquí para hacerlo más general, ya que ayudaría a muchos usuarios si alguien pudiera ayudar a completar el los espacios necesarios para tener una buena visión general de lo que sucede cuando?
La visión completa mediante ejemplos en pocas palabras:
A veces, la memoria devuelta por el nuevo operador se inicializará y, a veces, no dependerá de si el tipo que está creando es un POD (datos antiguos sin formato) o si es una clase que contiene miembros de POD y está usando un constructor predeterminado generado por el compilador.
- En C ++ 1998 hay 2 tipos de inicialización: inicialización cero y por defecto
- En C ++ 2003 se agregó un tercer tipo de inicialización, inicialización de valor .
- En C ++ 2011 / C ++ 2014, solo se agregó la inicialización de lista y las reglas para la inicialización de valor / predeterminado / cero cambiaron un poco.
Asumir:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
En un compilador de C ++ 98, debería ocurrir lo siguiente :
new A- valor indeterminado (Aes POD)new A()- inicializar ceronew B- construcción predeterminada (B::mno está inicializada,Bno es POD)new B()- construcción predeterminada (B::mno está inicializada)new C- construcción predeterminada (C::mse inicializa a cero,Cno es POD)new C()- construcción predeterminada (C::mse inicializa a cero)new D- construcción predeterminada (D::mno está inicializada,Dno es POD)new D()- construcción predeterminada? (D::mno está inicializado)
En un compilador conforme a C ++ 03, las cosas deberían funcionar así:
new A- valor indeterminado (Aes POD)new A()- value-initializeA, que es una inicialización cero ya que es un POD.new B- default-initializes (deja sinB::minicializar,Bno es POD)new B()- valor-inicializaBque cero todos los campos, ya que su ctor predeterminado es generado por el compilador en lugar de definido por el usuario.new C- default-initializesC, que llama al ctor predeterminado. (C::mestá inicializado a cero,Cno es POD)new C()- value-initializesC, que llama al ctor predeterminado. (C::mestá inicializado a cero)new D- construcción predeterminada (D::mno está inicializada,Dno es POD)new D()- valor-inicializa D? , que llama al ctor predeterminado (D::mno está inicializado)
Valores en cursiva y? son incertidumbres, por favor ayude a corregir esto :-)
En un compilador conforme a C ++ 11, las cosas deberían funcionar así:
??? (por favor ayúdenme si empiezo aquí, de todos modos saldrá mal)
En un compilador compatible con C ++ 14, las cosas deberían funcionar así: ??? (por favor ayude si empiezo aquí, de todos modos saldrá mal )
new A- default-initializesA, compilador gen. ctor, (deja sinA::minicializar) (Aes POD)new A()- valor-inicializaA, que es cero-inicialización desde 2. punto en [dcl.init] / 8new B- default-initializesB, compilador gen. ctor, (deja sinB::minicializar) (Bno es POD)new B()- value-initializes,Bque inicializa a cero todos los campos, ya que su ctor predeterminado es generado por el compilador en lugar de definido por el usuario.new C- default-initializesC, que llama al ctor predeterminado. (C::mestá inicializado a cero,Cno es POD)new C()- value-initializesC, que llama al ctor predeterminado. (C::mestá inicializado a cero)new D- default-initializesD(D::mno está inicializado,Dno es POD)new D()- value-initializesD, que llama al ctor predeterminado (D::mno está inicializado)new E- default-initializesE, que llama a comp. gen. ctor. (E::mno está inicializado, E no es POD)new E()- value-initializesE, que se inicializa a ceroEdesde el punto 2 en [dcl.init] / 8 )new F- default-initializesF, que llama a comp. gen. ctor. (F::mno está inicializado,Fno es POD)new F()- value-initializesF, que se inicializa por defectoFdesde 1. punto en [dcl.init] / 8 (laFfunción ctor es proporcionada por el usuario si está declarada por el usuario y no está explícitamente predeterminada o eliminada en su primera declaración. Enlace )