if(cond) と if(cond == true) は同じ意味ではない

if(cond)コンパイルは通るが、 if(cond == true) と書くとコンパイルが通らない例がある。

struct bool_ {
  bool value;
  constexpr explicit operator bool() const noexcept {
    return value;
  }
};

int main() {
  bool_ x{true};
  if (x == true) {
    // do something
  }
}

http://melpon.org/wandbox/permlink/jCXG8WMDTBLhvWI2


C++03 でも operator== のオーバーロードで似た問題が起きるケースが有ったが、 C++11 で explicit operator bool が登場し、広く使われるようになったことで、この問題に遭遇する機会が増えている。
魔黒などを使う場合には注意が必要だ。