C++ named requirements: BooleanTestable
Specifies that an expression of such a type and value category is convertible to bool, and for which the logical operators for the type or two different BooleanTestable types have the usual behavior (including short-circuiting).
Requirements
Let e be an expression of a certain type and value category. The type and value category meet the BooleanTestable requirements if:
!eis well-formed and does not modify the object denoted bye, if any, except that ifeis an xvalue, the denoted object can be left in a valid but unspecified state(since C++11).- Both
eand!eare convertible toboolby both implicit conversion and static_cast. - Conversions in both manners produce equal results and do not modify the source object, if any, except that if
eor!eis an xvalue, the source object can be left in a valid but unspecified state(since C++11). bool(!e) == !bool(e)holds.- No viable non-member
operator&&andoperator||is visible by argument-dependent lookup for the type ofeor!e. - If
eor!eis of a class type, the class does not define any memberoperator&&oroperator||.
Notes
The standard does not define a named requirement with this name. It was originally proposed in an early resolution of LWG2114, but was superseded by the exposition-only concept boolean-testable in the final resolution P2167R3. Because implementations generally expect the provided types to model boolean-testable even in pre-C++20 modes, we intentedly treat P2167R3 as a defect report and transform the boolean-testable to legacy named requirements.
When the && and || operators are used with operands whose type and value category are BooleanTestable, built-in versions are selected and short-circuit evaluation is performed.
|
The type and value category of an expression |
(since C++20) |
Examples of BooleanTestable types (with any value category) include bool, std::true_type(since C++11), std::bitset<N>::reference, and int*.
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2114 (P2167R3) |
C++98 | convertibility to bool was too weak to reflect the expectation of implementations
|
requirements strengthened |
See also
(C++20) |
specifies that a type can be used in Boolean contexts (exposition-only concept*) |