Estou muito confuso sobre a inicialização de valor e padrão e zero. e especialmente quando eles são iniciados para os diferentes padrões C ++ 03 e C ++ 11 (e C ++ 14 ).
Estou citando e tentando estender uma resposta realmente boa Valor- / Padrão- / Zero- Init C ++ 98 e C ++ 03 aqui para torná-lo mais geral, pois ajudaria muitos usuários se alguém pudesse ajudar a preencher o lacunas necessárias para ter uma boa visão geral sobre o que acontece quando?
O insight completo por exemplos em poucas palavras:
Às vezes, a memória retornada pelo novo operador será inicializada, e às vezes não, dependendo se o tipo que você está atualizando é um POD (dados antigos simples) , ou se é uma classe que contém membros POD e está usando um construtor padrão gerado pelo compilador.
- Em C ++ 1998 existem 2 tipos de inicialização: zero e default-inicialização
- Em C ++ 2003, um terceiro tipo de inicialização, inicialização de valor foi adicionado.
- Em C ++ 2011 / C ++ 2014, apenas a inicialização de lista foi adicionada e as regras para inicialização de valor / padrão / zero mudaram um pouco.
Presumir:
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 */
Em um compilador C ++ 98, o seguinte deve ocorrer :
new A
- valor indeterminado (A
é POD)new A()
- inicializar zeronew B
- construção padrão (B::m
não inicializada,B
não POD)new B()
- construção padrão (B::m
não inicializada)new C
- construção padrão (C::m
é inicializado com zero,C
não é POD)new C()
- construção padrão (C::m
é inicializado com zero)new D
- construção padrão (D::m
não inicializada,D
não POD)new D()
- construção padrão? (D::m
não foi inicializado)
Em um compilador compatível com C ++ 03, as coisas devem funcionar assim:
new A
- valor indeterminado (A
é POD)new A()
- value-initializeA
, que é inicialização zero, pois é um POD.new B
- inicializa por padrão (deixaB::m
não inicializado,B
não é POD)new B()
- value-initializesB
que inicializa com zero todos os campos, pois seu ctor padrão é gerado pelo compilador em oposição ao definido pelo usuário.new C
- default-initializesC
, que chama o ctor padrão. (C::m
é inicializado com zero,C
não é POD)new C()
- value-initializesC
, que chama o ctor padrão. (C::m
é inicializado com zero)new D
- construção padrão (D::m
não inicializada,D
não POD)new D()
- o valor inicializa D? , que chama o ctor padrão (D::m
não foi inicializado)
Valores em itálico e? são incertezas, por favor ajude a corrigir isso :-)
Em um compilador compatível com C ++ 11, as coisas devem funcionar assim:
??? (por favor me ajude se eu começar aqui, mesmo assim, vai dar errado)
Em um compilador compatível com C ++ 14, as coisas devem funcionar assim: ??? (por favor, ajude se eu começar aqui, de qualquer forma, ele dará errado) (Rascunho com base na resposta)
new A
- inicializa por padrãoA
, compilador gen. ctor, (deixa de serA::m
inicializado) (A
é POD)new A()
- inicializa o valorA
, que é a inicialização de zero desde 2. ponto em [dcl.init] / 8new B
- inicializa por padrãoB
, compilador gen. ctor, (deixa de serB::m
inicializado) (B
não é POD)new B()
- value-initializesB
que inicializa com zero todos os campos, pois seu ctor padrão é gerado pelo compilador em oposição ao definido pelo usuário.new C
- default-initializesC
, que chama o ctor padrão. (C::m
é inicializado com zero,C
não é POD)new C()
- value-initializesC
, que chama o ctor padrão. (C::m
é inicializado com zero)new D
- inicializa por padrãoD
(D::m
não é inicializado,D
não é POD)new D()
- value-initializesD
, que chama o ctor padrão (D::m
não é inicializado)new E
- default-initializesE
, que chama o comp. gen. ctor. (E::m
não foi inicializado, E não é POD)new E()
- inicializa o valorE
, que é inicializado com zeroE
desde 2 pontos em [dcl.init] / 8 )new F
- default-initializesF
, que chama o comp. gen. ctor. (F::m
não foi inicializado,F
não é POD)new F()
- value-initializesF
, que inicializa por padrãoF
desde 1. ponto em [dcl.init] / 8 (aF
função ctor é fornecida pelo usuário se for declarada pelo usuário e não explicitamente padronizada ou excluída em sua primeira declaração. Link )