18 Concepts library [concepts]

18.5 Comparison concepts [concepts.compare]

18.5.2 Concept Boolean [concept.boolean]

The Boolean concept specifies the requirements on a type that is usable in Boolean contexts.
template<class B> concept Boolean = Movable<remove_cvref_t<B>> && // (see [concepts.object]) requires(const remove_reference_t<B>& b1, const remove_reference_t<B>& b2, const bool a) { { b1 } -> ConvertibleTo<bool>; { !b1 } -> ConvertibleTo<bool>; { b1 && a } -> Same<bool>; { b1 || a } -> Same<bool>; { b1 && b2 } -> Same<bool>; { a && b2 } -> Same<bool>; { b1 || b2 } -> Same<bool>; { a || b2 } -> Same<bool>; { b1 == b2 } -> ConvertibleTo<bool>; { b1 == a } -> ConvertibleTo<bool>; { a == b2 } -> ConvertibleTo<bool>; { b1 != b2 } -> ConvertibleTo<bool>; { b1 != a } -> ConvertibleTo<bool>; { a != b2 } -> ConvertibleTo<bool>; };
For some type B, let b1 and b2 be lvalues of type const remove_­reference_­t<B>.
B models Boolean only if
[Example
:
The types bool, true_­type ([meta.type.synop]), and bitset<N>::reference ([template.bitset]) are Boolean types.
Pointers, smart pointers, and types with only explicit conversions to bool are not Boolean types.
end example
]