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 (A
es POD)new A()
- inicializar ceronew B
- construcción predeterminada (B::m
no está inicializada,B
no es POD)new B()
- construcción predeterminada (B::m
no está inicializada)new C
- construcción predeterminada (C::m
se inicializa a cero,C
no es POD)new C()
- construcción predeterminada (C::m
se inicializa a cero)new D
- construcción predeterminada (D::m
no está inicializada,D
no es POD)new D()
- construcción predeterminada? (D::m
no está inicializado)
En un compilador conforme a C ++ 03, las cosas deberían funcionar así:
new A
- valor indeterminado (A
es POD)new A()
- value-initializeA
, que es una inicialización cero ya que es un POD.new B
- default-initializes (deja sinB::m
inicializar,B
no es POD)new B()
- valor-inicializaB
que 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::m
está inicializado a cero,C
no es POD)new C()
- value-initializesC
, que llama al ctor predeterminado. (C::m
está inicializado a cero)new D
- construcción predeterminada (D::m
no está inicializada,D
no es POD)new D()
- valor-inicializa D? , que llama al ctor predeterminado (D::m
no 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::m
inicializar) (A
es 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::m
inicializar) (B
no es POD)new B()
- value-initializes,B
que 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::m
está inicializado a cero,C
no es POD)new C()
- value-initializesC
, que llama al ctor predeterminado. (C::m
está inicializado a cero)new D
- default-initializesD
(D::m
no está inicializado,D
no es POD)new D()
- value-initializesD
, que llama al ctor predeterminado (D::m
no está inicializado)new E
- default-initializesE
, que llama a comp. gen. ctor. (E::m
no está inicializado, E no es POD)new E()
- value-initializesE
, que se inicializa a ceroE
desde el punto 2 en [dcl.init] / 8 )new F
- default-initializesF
, que llama a comp. gen. ctor. (F::m
no está inicializado,F
no es POD)new F()
- value-initializesF
, que se inicializa por defectoF
desde 1. punto en [dcl.init] / 8 (laF
funció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 )