My class has an explicit conversion to bool:
struct T {
explicit operator bool() const { return true; }
};
and I have an instance of it
The standard mentions places where a value may be "contextually converted to bool". They fall into four main groups:
if (t) /* statement */;
for (;t;) /* statement */;
while (t) /* statement */;
do { /* block */ } while (t);
!t
t && t2
t || t2
t ? "true" : "false"
The operator needs to be constexpr for these:
static_assert(t);
noexcept(t)
if constexpr (t)
NullablePointer T
Anywhere the Standard requires a type satisfying this concept (e.g. the pointer type of a std::unique_ptr), it may be contextually converted. Also, the return value of a NullablePointer's equality and inequality operators must be contextually convertible to bool.
std::remove_if(first, last, [&](auto){ return t; });
In any algorithm with a template parameter called Predicate or BinaryPredicate, the predicate argument can return a T.
std::sort(first, last, [&](auto){ return t; });
In any algorithm with a template parameter called Compare, the comparator argument can return a T.(source1, source2)
Do be aware that a mix of const and non-const conversion operators can cause confusion: