4

次のようなコードを実行すると

istream s;
if (s)
  // ...

istream(または任意のiOSオブジェクト)の真理値をテストできます。私の理解では、これはiosが関数を定義する方法のためにそれが行うのと同じようにoperator!機能します。(参考までに、http://www.cplusplus.com/reference/ios/ios/operatornot/を参照してください。)私の質問はs、上記のようにifステートメント内に入れるとoperator!関数が評価されるのはなぜですか?二次的な質問として、ifステートメント内にオブジェクトだけを入れた場合、C ++がその真実性を評価するために使用できる可能性のある方法は何ですか?

4

3 に答える 3

5

C++03 では、このチェックはoperator void*メンバー関数を介して行われ、ストリームが良好な状態の場合は null 以外のポインターを返し、それ以外の場合は NULL を返しました。null ポインターは false と評価され、null 以外のポインターは true と評価されるため、このチェックは正常に機能しました。

ただし、これを行うことができるため、問題がありました。

std::cout << std::cout;

これにより、関数が呼び出され、ストリームが良好かどうかに応じて、operator void*0 または のアドレスが出力されます。cout上記のコードはそうしていないように見えるので、これは良いことではありません。さらに悪いことに、あなたはできる

delete std::cout;

ストリームが良くない場合、未定義の動作が発生します。

C++11 では、これが変更され、ストリームにexplicit operator boolメンバー関数が含まれるようになりました。これにより、ストリームを bool に明示的にキャストできます。これにより、上記の問題が解消され、今後のオブジェクトの if チェックをサポートするための推奨される方法になります。

お役に立てれば!

于 2013-01-27T18:47:52.133 に答える
2

テンプレートbasic_iosには、explicit operator boolこのコンテキストで呼び出されるがあります。昔はそうだっoperator void*たのですが、いつか誰かが書くのではないかと心配する人もいたので、物議をかもしましたdelete my_stream

于 2013-01-27T18:46:33.883 に答える
0

std::istreamoperator bool()ifステートメントで呼び出されるオーバーロードがあります。operator!ストリームでエラーが発生したかどうかをチェックするメンバー関数でもありますが、この場合はifステートメント内では使用されません。

于 2013-01-27T18:46:43.437 に答える