9

この回答std::ifstreamでは、オブジェクトの変換を使用しboolて、ストリームがまだ良好な状態にあるかどうかをテストすることについて話します。詳細について Josuttis の本 (p. 600) を調べたところ、iostreamオブジェクトが実際にオーバーロードしていることがわかりましたoperator void*。ストリームが不正な場合 (暗黙的に に変換される) は null ポインターを返し、falseそれ以外の場合 (暗黙的に に変換される) は非null ポインターを返しますtrue。オーバーロードしないのはなぜoperator boolですか?

4

3 に答える 3

13

C++0x 標準セクション 27.4.4.3 に答えがあるようです (私の強調)。

operator unspecified-bool-type() const;

戻り値: If fail()then は、ブール コンテキストで false と評価される値。それ以外の場合は、ブール コンテキストで true と評価される値。 返される値の型は に変換できませんint

注: この変換は、boolが期待されるコンテキスト (if 条件など) で使用できます。intただし、 で発生する可能性のある暗黙的な変換 ( など)boolは許可されていないため、ユーザー エラーの原因がいくつか排除されます。

于 2009-08-26T13:55:54.750 に答える
8

これは、「セーフ ブール」問題の例です。

ここに良い記事があります: http://www.artima.com/cppsource/safebool.html .

C++0x は、explicitKristo が言及している変更だけでなく、変換関数の状況にも役立ちます。C++ 11 では、safe-bool イディオムは廃止されましたか? .

于 2011-08-05T06:16:34.700 に答える
0

最新のC++11には、次のものが必要です。

explicit operator bool() const;

C ++1127.5.5.4-1を参照してください。しかし、「明示的」は私には奇妙に思えます。

于 2012-05-15T06:15:28.760 に答える