今日始めて知りました。次の結果はどうなるか?
std::cout << (static_cast<bool>(1) == static_cast<bool>(2)) << std::endl;
C++のbool型は整数型なのでこの結果は0(偽)になると思っていたのですが、正解は1(真)。我ながら予想以上のショック。bool型専用の比較演算子が定義されているんですね。
Pascal(Delphi)では次の結果はFALSEになるので、そのつもりのまま来てしまっていたのかもしれません。
Writeln(Boolean(1) = Boolean(2))
他にも演算子が定義されているんだろうか?と、次の演算も試してみました。
std::cout << (static_cast<bool>(1) ^ static_cast<bool>(2)) << std::endl;
果たして、結果は0。なんと、排他的論理和も定義されているのか!?
…と思ったのも束の間。落ち着いて次のようにしてみると。
std::cout << typeid(static_cast<bool>(1) ^ static_cast<bool>(2)).name() << std::endl;
表示されたのはint型。つまり、それぞれのbool型の値がint型の値に変換され、それのxorをとった結果が表示されただけでした。ふたたび罠にはまるところでした。
でもこのbool型の演算も、組み込みの型だから有効なのであって、C/C++の両方で有効なようにとtypedef int Bool;
とか定義して、この定義した型を使うように指定された時点で一発で破綻。
結論。bool型の比較は要注意ということで。