std::basic_ios<CharT,Traits>::operator bool
| operator /* 未指定のブール型 */() const; |
(1) | (C++11まで) |
| explicit operator bool() const; |
(2) | (C++11以降) |
ストリームにエラーがないかチェックします。
この演算子により、ストリームやストリームへの参照を返す関数をループ条件として使用できるようになり、`while (stream >> value) {...}` や `while (std::getline(stream, string)) {...}` のような慣用的な C++ の入力ループが可能になります。これらのループは、入力操作が成功した場合にのみループ本体を実行します。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
[編集] 注意
この変換は、`bool` が期待されるコンテキスト (例: `if` 文の条件) で使用できます。ただし、`bool` で発生する可能性のある暗黙の変換 (例: `int` への変換) は許可されません。
C++98 では、セーフブール問題により `operator bool` を直接提供することはできませんでした。C++98 での最初の解決策は `operator void*` を提供することでしたが、これは `fail()` が `true` を返す場合はヌルポインタを、それ以外の場合はヌルポインタでないポインタを返します。これは、LWG issue 468 の解決により置き換えられ、セーフブールイディオムを適用できるようになりました。
C++11 以降、変換関数は `explicit` にすることができます。LWG issue 1094 の解決により、明示的な `operator bool` が導入され、ブール変換は安全になりました。
[編集] 例
#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'; }
出力
s is true 1 2 3 s is false
[編集] 欠陥レポート
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 468 | C++98 | `operator void*` が提供されていました | 代わりに未指定のブール型への変換関数が提供されます |
[編集] 関連項目
以下の表は、すべての可能な ios_base::iostate フラグの組み合わせに対する basic_ios アクセサ(good()、fail() など)の値を示しています。
| ios_base::iostate フラグ | basic_ios アクセサ | |||||||
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 |