26

istream オブジェクトを bool 式として使用できる理由を知っている人はいますか? 例えば:

ifstream input("tmp");
int iValue;
while (input >> iValue)
    //do something;

ここでinput >> iValueは、ifstream オブジェクトへの参照を返します。このオブジェクトをブール式として使用できる理由を知りたいです。
ifstream クラスを調べたところ、次のメンバー関数が原因である可能性があることがわかりました。

operator void * ( ) const;

この機能の詳細については、こちらを参照してください。
もしそうなら、誰かが私にこの機能を説明できますか? この関数のプロトタイプは、通常の演算子のオーバーロード宣言とは異なります。この関数の戻り値の型は何ですか?
そうでない場合、ifstream オブジェクトを bool 式として使用できる理由は何ですか?
あなたの助けを楽しみにしています!

チェン

4

2 に答える 2

24

ブール式としてistreamを使用できるようにする正確なメカニズムは、C++11で変更されました。以前は、お気づきのようにvoid*、への暗黙の変換でした。C ++ 11では、代わりに。へのexplicit変換boolです。

ブール式でのistreamまたはostreamの使用が有効になり、C++プログラマーがaまたはループの条件として副作用のある式を引き続き使用できるようになりました。whilefor

SomeType v;

while( stream >> v )
{
    // ...
}

そして、プログラマーがそれを行い、それを望んでいる理由は、それがより簡潔なコード、たとえば…</p>よりも一目で理解しやすいコードを提供するからです。

for( ;; )
{
    SomeType v;
    
    stream >> v;
    if( stream.fail() )
    {
        break;
    }
    // ...
}

ただし、場合によっては、そのような冗長な構造でも望ましい場合があります。場合によります。

于 2011-11-14T05:20:25.100 に答える
7

指定された型へのキャスト演算子です。operator T ()は型 T へのキャスト演算子です。ifステートメントでは、ifstreamが に変換されvoid*、次に が にvoid*変換されboolます。

于 2011-11-14T05:10:08.253 に答える