5

私は C っぽい C++ コードの一部を見つけて、(少しアカデミックな) 質問を自問しましboolif

int val;
if( (std::cin >> val) == 0 )
    ...

私はこれまでに得ました:

  • std::cin >> val(a ref to) を返すcinため、istream&
  • したがって、オペランドとしてandを==受け取ります。cin0istreamint

bool operator==(istream&, int)利用可能な (および のそれぞれのメンバー関数も)とは思わないistreamので、変換が必要ですか?


明確にするために、プログラマーの意図は、入力が成功したかどうかを確認することでした。つまり、if(!(std::cin >> val)).

4

2 に答える 2

1

利用可能な [...]があるとは思わないbool operator==(istream&, int)ので、変換が必要ですか?

それはそう。エラーが発生しなかった場合、またはエラーが発生しなかった場合に返す変換演算子boolがあります。truefalse

C++11 標準のパラグラフ 27.5.5.4/1 によると:

explicit operator bool() const;

1戻り値: !fail().

したがって、式 ( )は、 の左オペランドであるcin >> val(への参照) を返します。右オペランドはです。cin==0

cinを に変換できるようになりbool、 との比較が可能になりました0。つまり、ifステートメントは次と同等です。

if (!(std::cin >> val))
{
    // ...
}
于 2013-06-09T13:46:09.500 に答える
0

書かれたコードは形式が正しくないと思います。

最適化せずにコンパイルしてアセンブリを出力すると、ここでどの演算子または変換関数が呼び出されたかを確認できる場合があります。

#include <istream>

void f(std::istream &is)
{
    is==0;
}
于 2013-06-16T16:37:09.270 に答える