std::basic_ios<CharT,Traits>:operator bool
| operator /* nicht spezifizierter boolescher Typ */() const; |
(1) | (bis C++11) |
| explicit operator bool() const; |
(2) | (seit C++11) |
Prüft, ob der Stream fehlerfrei ist.
Dieser Operator ermöglicht die Verwendung von Streams und Funktionen, die Referenzen auf Streams zurückgeben, als Schleifenbedingungen, was zu den idiomatischen C++-Eingabeschleifen wie while (stream >> value) {...} oder while (std::getline(stream, string)) {...} führt. Solche Schleifen führen den Schleifenkörper nur aus, wenn die Eingabeoperation erfolgreich war.
Inhalt |
[bearbeiten] Parameter
(keine)
[bearbeiten] Rückgabewert
[bearbeiten] Hinweise
Diese Konvertierung kann in Kontexten verwendet werden, in denen ein bool erwartet wird (z. B. eine if-Bedingung). Implizite Konvertierungen (z. B. zu int), die bei bool auftreten können, sind jedoch nicht zulässig.
In C++98 konnte operator bool aufgrund von das sichere Bool-Problem nicht direkt bereitgestellt werden. Die anfängliche Lösung in C++98 ist die Bereitstellung von operator void*, der einen Nullzeiger zurückgibt, wenn fail() true zurückgibt, oder einen Nicht-Nullzeiger andernfalls. Er wird durch die Lösung von LWG-Problem 468 ersetzt, das die Anwendung des Safe Bool Idioms ermöglicht.
Seit C++11 können Konvertierungsfunktionen explizit sein. Die Lösung von LWG-Problem 1094 führte den expliziten operator bool ein, und die boolesche Konvertierung ist nun sicher.
[bearbeiten] Beispiel
#include <iostream> #include <sstream> int main() { std::istringstream s("1 2 3 error"); int n; std::cout << std::boolalpha << "s is " << static_cast<bool>(s) << '\n'; while (s >> n) std::cout << n << '\n'; std::cout << "s is " << static_cast<bool>(s) << '\n'; }
Ausgabe
s is true 1 2 3 s is false
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 468 | C++98 | operator void* wurde bereitgestellt | Stattdessen wird eine Konvertierungsfunktion zu einem nicht spezifizierten booleschen Typ bereitgestellt |
[bearbeiten] Siehe auch
Die folgende Tabelle zeigt die Werte der basic_ios-Accessorfunktionen (good(), fail() usw.) für alle möglichen Kombinationen von ios_base::iostate-Flags
| ios_base::iostate Flags | basic_ios-Zugriffsfunktionen | |||||||
eofbit
|
failbit
|
badbit
|
good() | fail() | bad() | eof() | operator bool | operator! |
| false | false | false | true | false | false | false | true | false |
| false | false | true | false | true | true | false | false | true |
| false | true | false | false | true | false | false | false | true |
| false | true | true | false | true | true | false | false | true |
| true | false | false | false | false | false | true | true | false |
| true | false | true | false | true | true | true | false | true |
| true | true | false | false | true | false | true | false | true |
| true | true | true | false | true | true | true | false | true |