6

何度か、Boost ライブラリのドキュメントを熟読しているときに、「convertible tobool」とマークされた戻り値に出くわしました (そのページで「convertible to bool」というフレーズを検索してください。約 3 分の 1 ほど下にあります)。その理由を説明している論文への斜めの参照に出くわしたことがありますが、その論文を見つけることができませんでした(また、参照を見たページも見つかりません)。

単純boolbool.

4

3 に答える 3

25

「bool に変換可能」とは、単に boolean コンテキスト (if条件など) で意味のあるものを使用できることを意味します。これは、暗黙的な変換では意味があります。ブールコンテキストで使用したいオブジェクトを想像してくださいstd::fstream

ifstream ifs("filename");
while (ifs >> token)
    cout "token " << token << " read." << endl;

ここでifsは、ブール値に変換できます。実は、そうではありません。むしろ、それは に変換可能なものに変換可能boolです。これは、次のようなステートメントを防ぐためです。

int b = ifs;

その理由は、そのようなステートメントはおそらく意図されたものではないため、コンパイラーはそれを防止する必要があるからです。ではなく「convertible to bool」を返すことによりbool、これが達成されます。これは、2 つのユーザー定義の暗黙的な変換を 1 つの式で連鎖させることができないためです。

このコンテキストでは、安全な bool イディオムを調べたいと思うかもしれません。void*Chris は、戻り値の型として使用する 1 つの可能な実装を既にほのめかしています。通常、thisポインターは を表すために使用されtrueます。これは、STL によって使用されるものです。ただし、残念ながらこれにはまだ欠陥があります。いくつかの代替案が提案されており (上でリンクした記事にきちんとまとめられています)、私の知る限り、検討のために C++0x にも含まれています。ただし、これらの提案の現在の状況については知りません。

于 2008-11-04T20:26:52.400 に答える
11

bools は s に昇格int可能で、算術演算に参加できます。これは、値が真偽のテストにのみ使用されるべきである場合、多くの場合、望ましい結果ではありません。

convertible-to-boolは通常 のようなものvoid*で、null ポインタが false で、それ以外はすべて true ですが、算術演算には使用できません。

于 2008-11-04T20:25:27.783 に答える
0

多分パフォーマンスのため?C/C++ では、数値に対して if ステートメントを実行できます (0 は false、それ以外は true)。厳密な bool への変換は余分な操作であり、多くの場合必要ありません。

実際にブーストを使用したことがないので、これは単なる推測ですが、私には合理的なもののように思えます。

于 2008-11-04T20:17:13.213 に答える