これは、そのエラーの正しいコードではありません。xエラーは、からfooに変換できないことを示していますが、boolではなく、xです。aはbool 1に変換可能であるため、指定したコードにエラーはありません。foofoo*foo*
オブジェクトを条件として使用できるようにする場合は、クラスにメンバー関数fooを提供する必要があります。operator boolfoo
struct foo {
int bar;
operator bool() { return true; }
};
foo x;
int y = x ? 3 : 4;
この場合、 anyfooは常に と評価されtrueます。オブジェクトが予期しない場所でに変換される可能性があるため、この への変換boolは「安全ではない」と見なされます。boolこれを回避するには、C++03 ではセーフ bool イディオムoperator boolを使用でき、C++11 ではasをマークできますexplicit。
struct foo {
int bar;
explicit operator bool() { return true; }
};
は、ステートメントやループexplicit operator boolの条件など、特定の場所で自動的に使用されます。これをカバーする他の答えがあります。ifwhile
1算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、 type の prvalue に変換できますbool。ゼロ値、ヌル ポインター値、またはヌル メンバー ポインター値は に変換されfalseます。その他の値は に変換されtrueます。