Los tres tipos relevantes de inicialización, inicialización cero, inicialización por defecto e inicialización de valor para bool significan, respectivamente, que el bool se inicializa a falso, que el bool tiene un valor indeterminado, y que el bool es inicializado a falso
Por lo tanto, solo tiene que asegurarse de obtener una inicialización cero o de valor. Si se inicializa un objeto con una duración de almacenamiento automática o dinámica sin especificar un inicializador, se obtiene la inicialización predeterminada. Para obtener la inicialización del valor, necesita un inicializador vacío, ya sea ()
o {}
.
bool b{}; // b is value-initialized
bool *b2 = new bool{}; // *b2 is value-initialized
class foo {
bool b;
foo() : b() {}
};
foo f; // // f.b is value-initialized
Usted obtiene cero inicialización para un bool que tiene una duración de almacenamiento local estática o hilo y no tiene un inicializador.
static bool b; // b is zero-initialized
thread_local bool b2; // b2 is zero-initialized
Otro caso donde se obtiene cero inicialización es si el bool es un miembro de una clase sin un constructor proporcionado por el usuario y el constructor por defecto implícito es trivial, y la instancia de clase es cero o de valor inicializado
class foo {
bool b;
};
foo f{}; // f.b is zero-initialized
thread_local foo f2; // f2.b is zero-initialized
Tenga en cuenta que el código está en una plantilla cuya templatization es bool en el caso de esta pregunta, pero también podría ser no-POD, por lo que quiero constructor por defecto. – WilliamKF