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
Dies ist eine Instanz des "Safe Bool" -Problems.
Hier ist ein guter Artikel: http://www.artima.com/cppsource/safebool.html.
C++ 0x hilft die Situation mit explicit
Konvertierungsfunktionen, sowie die Änderung, die Kristo erwähnt. Siehe auch Is the safe-bool idiom obsolete in C++11?.
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 inint
.Anmerkung: Diese Umwandlung kann in Zusammenhängen verwendet werden, wo ein
bool
erwartet wird (beispielsweise ein, wenn die Bedingung); jedoch implizite Konvertierungen (z. B. zuint
) , die mitbool
auftreten können, sind nicht erlaubt, einige Quellen von Benutzerfehler zu beseitigen.
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.
'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
Diese Antwort ist veraltet. Es wurde nicht standardisiert, da explizite Konvertierungsfunktionen hinzugefügt wurden. – Potatoswatter