O que as seguintes frases significam em C ++: zero, padrão e boot de valor?

O que as seguintes frases significam em C ++:

O que um desenvolvedor de C ++ deve saber sobre eles?

Uma coisa a perceber é que a ‘boot de valor’ é nova no padrão C ++ 2003 – ela não existe no padrão original de 1998 (acho que pode ser a única diferença que é mais do que um esclarecimento). Veja a resposta de Kirill V. Lyadvinsky para as definições diretamente do padrão.

Veja essa resposta anterior sobre o comportamento do operator new para obter detalhes sobre o comportamento diferente desse tipo de boot e quando eles entram em ação (e quando eles diferem de c ++ 98 para C ++ 03):

  • Os parênteses após o nome do tipo fazem diferença com o novo?

O ponto principal da resposta é:

Às vezes, a memory retornada pelo novo operador será inicializada e, às vezes, não dependerá se o tipo que você está criando for um POD ou se for uma class que contém membros POD e está usando um construtor padrão gerado pelo compilador. .

  • Em C ++ 1998 existem 2 tipos de boot: zero e padrão
  • Em C ++ 2003, um terceiro tipo de boot, a boot do valor foi adicionada.

Para dizer o mínimo, é bastante complexo e quando os diferentes methods surgem são sutis.

Uma coisa que certamente deve estar ciente é que o MSVC segue as regras do C ++ 98, mesmo no VS 2008 (VC 9 ou cl.exe versão 15.x).

O snippet a seguir mostra que o MSVC e o Digital Mars seguem as regras do C ++ 98, enquanto o GCC 3.4.5 e o Comeau seguem as regras do C ++ 03:

 #include  #include  #include  struct A { int m; }; // POD struct B { ~B(); int m; }; // non-POD, compiler generated default ctor struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m int main() { char buf[sizeof(B)]; memset( buf, 0x5a, sizeof( buf)); // use placement new on the memset'ed buffer to make sure // if we see a zero result it's due to an explicit // value initialization B* pB = new(buf) B(); //C++98 rules - pB->m is uninitialized //C++03 rules - pB->m is set to 0 printf( "m is %d\n", pB->m); return 0; } 

C ++ 03 Standard 8.5 / 5:

Para inicializar zero um object do tipo T significa:
– se T é um tipo escalar (3.9), o object é ajustado para o valor 0 (zero) convertido para T;
– se T for um tipo de class não-union, cada membro de dados não estáticos e cada subobject de class base será inicializado com zero;
– se T é um tipo de união, o primeiro membro de dados nomeado do object é inicializado com zero;
– se T é um tipo de matriz, cada elemento é inicializado com zero;
– se T é um tipo de referência, nenhuma boot é executada.

Para inicializar por padrão um object do tipo T significa:
– se T for um tipo de class não-POD (cláusula 9), o construtor padrão para T é chamado (e a boot é mal formada se T não tiver nenhum construtor padrão acessível);
– se T é um tipo de matriz, cada elemento é inicializado por padrão;
– caso contrário, o object é inicializado com zero.

Para inicializar o valor de um object do tipo T significa:
– se T é um tipo de class (cláusula 9) com um construtor declarado pelo usuário (12.1), então o construtor padrão para T é chamado (e a boot é mal formada se T não tiver nenhum construtor padrão acessível);
– se T for um tipo de class não-union sem um construtor declarado pelo usuário, então todos os membros de dados não estáticos e o componente de class base de T é inicializado por valor;
– se T é um tipo de matriz, então cada elemento é inicializado por valor;
– caso contrário, o object será inicializado com zero

Um programa que exige boot padrão ou boot de valor de uma entidade do tipo de referência é mal formado. Se T for um tipo qualificada para cv, a versão cv não qualificada de T é usada para essas definições de boot zero, boot padrão e boot de valor.