2009-08-26 5 views
9

In this answer Ich spreche über die Verwendung einer std::ifstream Objekt Umwandlung zu bool zu testen, ob der Strom noch in einem guten Zustand ist. Ich habe im Josuttis-Buch nach weiteren Informationen gesucht (S. 600, wenn Sie daran interessiert sind), und es stellt sich heraus, dass die iostream Objekte tatsächlich überlasten operator void*. Es gibt einen Null-Zeiger zurück, wenn der Stream fehlerhaft ist (der implizit in false konvertiert werden kann), und andernfalls einen Zeiger ungleich Null (implizit in true konvertiert). Warum überlasten sie nicht einfach operator bool?Warum überlasten Iostream-Objekte den Operator bool nicht?

Antwort

13

Es sieht so aus, als ob der C++ 0x Standard Abschnitt 27.4.4.3 die Antwort hat (Betonung meins).

operator unspecified-bool-type() const; 

Rückkehr: Wenn fail() dann ein Wert, wird in einem boolean Kontext falsch bewerten; andernfalls wird ein Wert in einem booleschen Kontext als wahr ausgewertet. Der zurückgegebene Werttyp darf nicht sein, umwandelbar in int.

Anmerkung: Diese Umwandlung kann in Zusammenhängen verwendet werden, wo ein bool erwartet wird (beispielsweise ein, wenn die Bedingung); jedoch implizite Konvertierungen (z. B. zu int) , die mit bool auftreten können, sind nicht erlaubt, einige Quellen von Benutzerfehler zu beseitigen.

+0

Diese Antwort ist veraltet. Es wurde nicht standardisiert, da explizite Konvertierungsfunktionen hinzugefügt wurden. – Potatoswatter

-1

Der neueste 11 C++ erfordert, dass:

explicit operator bool() const; 

See C++ 11 27.5.5.4-1. Das "Explizite" erscheint mir allerdings merkwürdig.

+1

'Explizit' ist der Grund, warum es hinzugefügt wurde. Eine "explizite" Konvertierungsfunktion wie diese wird nur angewendet, wenn es sich um die * only * Konvertierung handelt, in diesem Fall wird sie 'iostream' in' bool' konvertieren, aber nicht in 'int' über eine intermediäre' bool' Konvertierung. Lesen Sie die anderen Antworten auf dieser Seite, um mehr über die Safe Bool Idiom zu erfahren. – Potatoswatter