class Testable { bool ok_; typedef void (Testable::*bool_type)() const; void this_type_does_not_support_**comparisons() const {} public: explicit Testable(bool b=true):ok_(b) {}
operator bool_type() const { return ok_==true ? &Testable::this_type_does_not_**support_comparisons : 0; } };
Testable t(true);
bool b = t; // Compiles OK - Ooops!
I'm curious, why is this bad? I personally hate the fact, that the above doesn't compile for explicit operator bool(), which leads to idioms like !!t.
It's bad because the type isn't logically convertible to bool, BTW the !!t idiom isn't required in C++11 mode, the following works just fine: #include <iostream> class Testable { bool ok_; typedef void (Testable::*bool_type)() const; void this_type_does_not_support_comparisons() const {} public: explicit Testable(bool b=true):ok_(b) {} explicit operator bool() const { return ok_; } }; int main() { Testable t(true); if(t) std::cout << "Yeh\n"; if(!t) std::cout << "Oh\n"; bool b = t ? true : false; return 0; } John.