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::mnão inicializada,Bnão POD)new B()- construção padrão (B::mnão inicializada)new C- construção padrão (C::mé inicializado com zero,Cnão é POD)new C()- construção padrão (C::mé inicializado com zero)new D- construção padrão (D::mnão inicializada,Dnão POD)new D()- construção padrão? (D::mnã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::mnão inicializado,Bnão é POD)new B()- value-initializesBque 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,Cnão é POD)new C()- value-initializesC, que chama o ctor padrão. (C::mé inicializado com zero)new D- construção padrão (D::mnão inicializada,Dnão POD)new D()- o valor inicializa D? , que chama o ctor padrão (D::mnã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::minicializado) (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::minicializado) (Bnão é POD)new B()- value-initializesBque 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,Cnão é POD)new C()- value-initializesC, que chama o ctor padrão. (C::mé inicializado com zero)new D- inicializa por padrãoD(D::mnão é inicializado,Dnão é POD)new D()- value-initializesD, que chama o ctor padrão (D::mnão é inicializado)new E- default-initializesE, que chama o comp. gen. ctor. (E::mnão foi inicializado, E não é POD)new E()- inicializa o valorE, que é inicializado com zeroEdesde 2 pontos em [dcl.init] / 8 )new F- default-initializesF, que chama o comp. gen. ctor. (F::mnão foi inicializado,Fnão é POD)new F()- value-initializesF, que inicializa por padrãoFdesde 1. ponto em [dcl.init] / 8 (aFfunçã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 )