[concept.booleantestable] (original) (raw)
18 Concepts library [concepts]
18.5 Comparison concepts [concepts.compare]
18.5.2 Boolean testability [concept.booleantestable]
Let e be an expression such thatdecltype((e)) is T.
T models boolean-testable-impl only if
- either remove_cvref_t<T> is not a class type, or a search for the names operator&& and operator||in the scope of remove_cvref_t<T>finds nothing; and
- argument-dependent lookup ([basic.lookup.argdep]) for the names operator&& and operator||with T as the only argument type finds no disqualifying declaration (defined below).
A disqualifying parameteris a function parameter whose declared type P
- is not dependent on a template parameter, and there exists an implicit conversion sequence ([over.best.ics]) from e to P; or
- is dependent on one or more template parameters, and either
- P contains no template parameter that participates in template argument deduction ([temp.deduct.type]), or
- template argument deduction using the rules for deducing template arguments in a function call ([temp.deduct.call]) ande as the argument succeeds.
A key parameter of a function template Dis a function parameter of type cv X or reference thereto, where X names a specialization of a class template that has the same innermost enclosing non-inline namespace as D, andX contains at least one template parameter that participates in template argument deduction.
[Example 1:
Innamespace Z { template<class> struct C {};template<class T> void operator&&(C<T> x, T y);template<class T> void operator||(C<type_identity_t<T>> x, T y);} the declaration of Z::operator&&contains one key parameter, C<T> x, and the declaration of Z::operator||contains no key parameters.
— _end example_]
A disqualifying declaration is
- a (non-template) function declaration that contains at least one disqualifying parameter; or
- a function template declaration that contains at least one disqualifying parameter, where
- at least one disqualifying parameter is a key parameter; or
- the declaration contains no key parameters; or
- the declaration declares a function template to which no name is bound ([dcl.meaning]).
[Note 1:
The intention is to ensure that given two types T1 and T2that each model boolean-testable-impl, the && and || operators within the expressionsdeclval<T1>() && declval<T2>() anddeclval<T1>() || declval<T2>()resolve to the corresponding built-in operators.
— _end note_]
template<class T> concept [_boolean-testable_](#concept:boolean-testable "18.5.2 Boolean testability [concept.booleantestable]") = // _exposition only_ [_boolean-testable-impl_](#concept:boolean-testable-impl "18.5.2 Boolean testability [concept.booleantestable]")<T> && requires(T&& t) { { !std::forward<T>(t) } -> [_boolean-testable-impl_](#concept:boolean-testable-impl "18.5.2 Boolean testability [concept.booleantestable]");};
Let e be an expression such thatdecltype((e)) is T.
T models boolean-testable only ifbool(e) == !bool(!e).
[Example 2:
— _end example_]