5

En C++, ¿puedo depender de que un nuevo bool se inicialice en falso en todos los casos?¿Puedo depender de un nuevo bool inicializado en falso?

bool *myBool = new bool(); 

assert(false == *myBool); // Always the case in a proper C++ implementation? 

(código actualizado para reflejar los comentarios.)

+0

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

Respuesta

6

En este caso, sí; pero la razón es bastante sutil.

Los paréntesis en new bool() causa valor de inicialización, que inicializa como false. Sin ellos, new bool hará inicialización por defecto, que lo deja con un valor no especificado.

Personalmente, prefiero ver new bool(false) si es posible, para dejar en claro que debe inicializarse.

(Eso es suponiendo que hay una buena razón para usar new, e incluso si existe, debe ser administrado por un puntero inteligente, pero eso está más allá del alcance de esta pregunta).

NOTA: esto responde la pregunta tal como estaba cuando la leí; había sido editado para cambiar su significado después de que se escribió la otra respuesta.

+0

Ha cambiado la pregunta cuya respuesta él ya sabe después de leer mi comentario en la otra respuesta. – Nawaz

+0

Pero estoy trabajando con una plantilla (no se muestra en la pregunta) por lo que no puedo proporcionar argumentos falsos explícitamente y en cambio dependo de la inicialización de valores para los objetos POD y no POD para los que quiero el constructor predeterminado. – WilliamKF

+0

@WilliamKF: OK, en ese caso no hay más remedio que usar la inicialización de valores. –

2

No. No hay inicialización automática en C++. Su nuevo bool se "inicializará" a lo que haya en la memoria en ese momento, que es más probable que sea cierto (ya que cualquier valor distinto de cero es verdadero), pero no hay garantía de ninguna manera.

Puede tener suerte y usar un compilador que sea agradable con usted y siempre asigne un valor falso a un nuevo bool, pero eso dependería del compilador y no se basaría en ningún estándar de idioma.

Usted debe siempre inicialice sus variables.

+3

O bien, puede hacer 'bool * b = new bool()'. – Nawaz

+0

Entonces, ¿args vacíos lo fuerza a falso? – WilliamKF

+1

@WilliamKF: Sí.:-) Está inicializado por defecto, que en este caso significa cero inicializado, lo que significa 'falso'. – Nawaz

3

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 
Cuestiones relacionadas