Die drei relevanten Arten der Initialisierung, Zero-Initialisierung, Standard-Initialisierung und Wert-Initialisierung für Bool bedeuten, dass die Bool auf False initialisiert wird, dass die Bool einen unbestimmten Wert hat, und dass die Bool ist initialisiert auf falsch.
Sie müssen also einfach sicherstellen, dass Sie Null oder Wert Initialisierung erhalten. Wenn ein Objekt mit automatischer oder dynamischer Speicherdauer initialisiert wird, ohne dass ein Initialisierer angegeben wurde, erhalten Sie die Standard-Initialisierung. Um die Initialisierung der Werte zu erhalten, benötigen Sie einen leeren Initialisierer, entweder ()
oder {}
.
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
Sie erhalten Null Initialisierung für eine Bool, die statische oder Gewinde lokale Speicherdauer hat und nicht über einen Initialisierer.
static bool b; // b is zero-initialized
thread_local bool b2; // b2 is zero-initialized
Ein weiterer Fall, in dem Sie Null-Initialisierung erhalten ist, wenn der Boolesche ohne vom Benutzer bereitgestellte Konstruktor ein Mitglied einer Klasse ist und die implizite Standardkonstruktor ist trivial, und die Klasseninstanz ist null- oder wert- initialisiert.
class foo {
bool b;
};
foo f{}; // f.b is zero-initialized
thread_local foo f2; // f2.b is zero-initialized
Beachten Sie, dass mein Code in einer Vorlage ist, deren Templatisierung bool im Falle dieser Frage ist, könnte aber auch Nicht-POD sein, für das ich einen Standardkonstruktor haben möchte. – WilliamKF