std::three_way_comparable, std::three_way_comparable_with
Defined in header <compare>
|
||
template< class T, class Cat = std::partial_ordering > concept three_way_comparable = |
(1) | (since C++20) |
template< class T, class U, class Cat = std::partial_ordering > concept three_way_comparable_with = |
(2) | (since C++20) |
template< class T, class Cat > concept __ComparesAs = |
(3) | (exposition only*) |
std::three_way_comparable
specifies that the three way comparison operator <=>
on T
yield results consistent with the comparison category implied by Cat
.std::three_way_comparable_with
specifies that the three way comparison operator <=>
on (possibly mixed) T
and U
operands yield results consistent with the comparison category implied by Cat
. Comparing mixed operands yields results equivalent to comparing the operands converted to their common type.In both definitions, __WeaklyEqualityComparableWith and __PartiallyOrderedWith are exposition-only concepts also used by equality_comparable
and totally_ordered
, respectively.
Semantic requirements
These concepts are modeled only if they are satisfied and all concepts they subsume are modeled.
T
and Cat
model std::three_way_comparable<T, Cat> only if, given lvalues a
and b
of type const std::remove_reference_t<T>, following are true:
- (a <=> b == 0) == bool(a == b),
- (a <=> b != 0) == bool(a != b),
- ((a <=> b) <=> 0) and (0 <=> (b <=> a)) are equal,
- bool(a > b) == bool(b < a),
- bool(a >= b) == !bool(a < b),
- bool(a <= b) == !bool(b < a),
- (a <=> b < 0) == bool(a < b),
- (a <=> b > 0) == bool(a > b),
- (a <=> b <= 0) == bool(a <= b), and
- (a <=> b >= 0) == bool(a >= b), and
- if
Cat
is convertible to std::strong_ordering,T
modelstotally_ordered
.
T
, U
, and Cat
model std::three_way_comparable_with<T, U, Cat> only if given
-
t
, an lvalue of type const std::remove_reference_t<T>, and -
u
, an lvalue of type const std::remove_reference_t<U>.
Let C
be std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>, the following are true:
- t <=> u and u <=> t have the same domain,
- ((t <=> u) <=> 0) and (0 <=> (u <=> t)) are equal,
- (t <=> u == 0) == bool(t == u),
- (t <=> u != 0) == bool(t != u),
- Cat(t <=> u) == Cat(C(t) <=> C(u)),
- (t <=> u < 0) == bool(t < u),
- (t <=> u > 0) == bool(t > u),
- (t <=> u <= 0) == bool(t <= u),
- (t <=> u >= 0) == bool(t >= u), and
- if
Cat
is convertible to std::strong_ordering,T
andU
model std::totally_ordered_with<T, U>.
Equality preservation
Expressions declared in requires-expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
Implicit expression variations
A requires-expression that uses an expression that is non-modifying for some constant lvalue operand also implicitly requires additional variations of that expression that accept a non-constant lvalue or (possibly constant) rvalue for the given operand unless such an expression variation is explicitly required with differing semantics. These implicit expression variations must meet the same semantic requirements of the declared expression. The extent to which an implementation validates the syntax of the variations is unspecified.
See also
specifies that operator == is an equivalence relation (concept) | |
specifies that the comparison operators on the type yield a total order (concept) |