何度か、Boost ライブラリのドキュメントを熟読しているときに、「convertible tobool
」とマークされた戻り値に出くわしました (そのページで「convertible to bool」というフレーズを検索してください。約 3 分の 1 ほど下にあります)。その理由を説明している論文への斜めの参照に出くわしたことがありますが、その論文を見つけることができませんでした(また、参照を見たページも見つかりません)。
単純bool
にbool
.
何度か、Boost ライブラリのドキュメントを熟読しているときに、「convertible tobool
」とマークされた戻り値に出くわしました (そのページで「convertible to bool」というフレーズを検索してください。約 3 分の 1 ほど下にあります)。その理由を説明している論文への斜めの参照に出くわしたことがありますが、その論文を見つけることができませんでした(また、参照を見たページも見つかりません)。
単純bool
にbool
.
「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 にも含まれています。ただし、これらの提案の現在の状況については知りません。
bool
s は s に昇格int
可能で、算術演算に参加できます。これは、値が真偽のテストにのみ使用されるべきである場合、多くの場合、望ましい結果ではありません。
convertible-to-bool
は通常 のようなものvoid*
で、null ポインタが false で、それ以外はすべて true ですが、算術演算には使用できません。
多分パフォーマンスのため?C/C++ では、数値に対して if ステートメントを実行できます (0 は false、それ以外は true)。厳密な bool への変換は余分な操作であり、多くの場合必要ありません。
実際にブーストを使用したことがないので、これは単なる推測ですが、私には合理的なもののように思えます。