2011-11-14 11 views
20

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

ここでinput >> iValueはifstreamオブジェクトへの参照を返します。このオブジェクトがなぜbool式として使用できるのかを知りたい。
私ははifstreamクラスに見て、これは以下のメンバ関数によるものであろうことを見つける:

operator void * () const; 

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

チェン

+0

まあは簡単な答えを持つにもかかわらず、質問をしました。 –

+0

C++ 11以降では、実際には '明示的な演算子bool()' –

答えて

20

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

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

SomeType v; 

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

そして、プログラマがそれを行い、それを望んでいる理由は、より簡潔なコード、一見した方が容易なコード…

for(;;) 
{ 
    SomeType v; 

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

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

乾杯& HTH。、

5

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

+4

'void *がboolに変換されました.. 'が正しくありません。むしろ、私は 'void *は0と比較される 'と言っています。 – iammilind

+0

すぐに返信してくれてありがとう、私はそれを得た。もう1つの質問があります:クラスに2つのキャスト演算子関数がある場合、1つはintに、もう1つはint *になります。 if(obj)の呼び出しでは、どのような場合に操作関数が呼び出されますか?どうして?ありがとう。 – cheng

+4

@ iammilind:それは正しいです。ポインタは 'bool'に変換されます。 §4.12と§6.4.1を確認してください。 –

関連する問題