これは、そのエラーの正しいコードではありません。x
エラーは、からfoo
に変換できないことを示していますが、bool
ではなく、x
です。aはbool 1に変換可能であるため、指定したコードにエラーはありません。foo
foo*
foo*
オブジェクトを条件として使用できるようにする場合は、クラスにメンバー関数foo
を提供する必要があります。operator bool
foo
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
の条件など、特定の場所で自動的に使用されます。これをカバーする他の答えがあります。if
while
1算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、 type の prvalue に変換できますbool
。ゼロ値、ヌル ポインター値、またはヌル メンバー ポインター値は に変換されfalse
ます。その他の値は に変換されtrue
ます。