5

Kann ich in C++ davon ausgehen, dass in allen Fällen ein neues Bool auf false initialisiert wird?Kann ich mich darauf verlassen, dass ein neues Bool auf false initialisiert wird?

bool *myBool = new bool(); 

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

(Aktualisiert Code Kommentar zu reflektieren.)

+0

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

Antwort

6

In diesem Fall ja; aber der Grund ist ziemlich subtil.

Die Klammern in new bool() Ursache Wert-Initialisierung, die sie als false initialisiert. Ohne sie wird new bool stattdessen default-initialization, die es mit einem unspezifizierten Wert verlässt.

Persönlich würde ich lieber new bool(false) sehen, wenn möglich, um klar zu machen, dass es initialisiert werden sollte.

(Das geht davon aus, dass es einen guten Grund gibt, new überhaupt zu verwenden; und selbst wenn, sollte es von einem intelligenten Zeiger verwaltet werden - aber das würde den Rahmen dieser Frage sprengen).

HINWEIS: Dies beantwortet die Frage so wie es war, als ich es gelesen habe; es war bearbeitet worden, um seine Bedeutung zu ändern, nachdem die andere Antwort geschrieben wurde.

+0

Er hat die Frage geändert, deren Antwort er bereits kennt, nachdem er meinen Kommentar zu der anderen Antwort gelesen hat. – Nawaz

+0

Aber ich arbeite mit einer Vorlage (nicht in der Frage gezeigt), so kann ich nicht explizit falsche Argument und stattdessen Wert-Initialisierung für beide POD und Nicht-POD-Objekte, für die ich Standardkonstruktor. – WilliamKF

+0

@WilliamKF: OK, in diesem Fall gibt es keine andere Wahl als die Wert-Initialisierung zu verwenden. –

2

Nein, es gibt keine automatische Initialisierung in C++. Dein neues Bool wird zu dem initialisiert, was zu diesem Zeitpunkt in Erinnerung war, was wahrscheinlicher ist (da jeder Wert ungleich null wahr ist), aber es gibt auch keine Garantie.

Sie könnten Glück haben und einen Compiler verwenden, der nett mit Ihnen spielt und immer einen falschen Wert einem neuen Bool zuweisen wird, aber das wäre compilerabhängig und basiert nicht auf irgendeinem Sprachstandard.

Sie sollten immer initialisieren Sie Ihre Variablen.

+3

Oder er kann 'bool * b = new bool()'. – Nawaz

+0

Also leere Argumente zwingt es falsch? – WilliamKF

+1

@WilliamKF: Ja.:-) Es ist default-initialisiert, was in diesem Fall null initialisiert bedeutet, was "false" bedeutet. – Nawaz

3

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 
Verwandte Themen