Namespaces
Variants

std::basic_ios<CharT,Traits>:: operator bool

From ja.cppreference.net
operator /* unspecified-boolean-type */ ( ) const ;
(1) (C++11まで)
explicit operator bool ( ) const ;
(2) (C++11以降)

ストリームにエラーがないかどうかをチェックします。

1) fail()が true を返す場合、ブーリアンコンテキストで false と評価される値を返し、それ以外の場合、ブーリアンコンテキストで true と評価される値を返します。
2) ストリームにエラーがなく、I/O操作の準備ができている場合に true を返します。具体的には、 ! fail ( ) を返します。

この演算子により、ストリームおよびストリームへの参照を返す関数をループ条件として使用することが可能になり、 while ( stream >> value ) { ... } や while ( std:: getline ( stream, string ) ) { ... } といった慣用的なC++入力ループが実現できます。このようなループは、入力操作が成功した場合にのみループ本体を実行します。

目次

パラメータ

(なし)

戻り値

1) ストリームにエラーがない場合、ブーリアンコンテキストで true と評価される値。それ以外の場合、ブーリアンコンテキストで false と評価される値。
2) true ストリームにエラーがない場合、 false それ以外の場合。

注記

この変換は、 bool が期待される文脈(例えば if条件 など)で使用できます。ただし、 bool で発生し得る 暗黙変換 (例えば int への変換など)は許可されません。

C++98では、 operator bool は safe bool問題 のため直接提供できませんでした。C++98での初期の解決策は operator void * を提供し、 fail ( ) が true を返す場合はnullポインタを、それ以外の場合は非nullポインタを返すようにすることでした。これは LWG issue 468 の解決により置き換えられ、 Safe Boolイディオム の適用が可能になりました。

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 * が提供されていた 未指定のブール型への変換関数が代わりに提供される

関連項目

以下の表は、すべての可能な basic_ios アクセサ( good() 、 fail() など)の値を、 ios_base::iostate フラグの全組み合わせに対して示しています:

**注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。すべてのコンテンツは以下のいずれかに該当します: - HTMLタグと属性(翻訳対象外) - ``タグ内のC++用語(`eofbit`, `failbit`, `badbit` - 翻訳対象外) - ``タグ内のC++メンバ関数名(`good()`, `fail()`, `bad()`, `eof()`, `operator bool`, `operator!` - 翻訳対象外) C++の専門用語は国際的に標準化されているため、日本語に翻訳せずそのまま使用することが標準的な慣習です。 **注記**: 提供されたHTMLコード内のテキスト「true」と「false」はC++のブール値リテラルであり、翻訳対象外のC++固有の用語に該当します。HTMLタグ、属性、およびC++コードはすべて原文のまま保持されています。 【注記】 提供されたHTMLコード内の「true」および「false」はC++のブール値リテラルであり、翻訳対象外のため原文のまま保持されています。HTMLタグ・属性、書式設定はすべて完全に維持されています。
ios_base::iostate フラグ basic_ios アクセサ
eofbit failbit badbit good() fail() bad() eof() operator bool operator!
false false false true false false false true false
偽 偽 真 偽 真 真 偽 偽 真
偽 真 偽 偽 真 偽 偽 偽 真
偽 真 真 偽 真 真 偽 偽 真
true false false false false false true true false
true false true false true true true false true
真 真 偽 偽 真 偽 真 偽 真
true true true false true true true false true