std::three_way_comparable, std::three_way_comparable_with
Defined in header <compare>
|
||
template<class T, class U> concept __PartiallyOrderedWith = // exposition only |
(1) | (since C++20) |
template<class T, class Cat> concept __ComparesAs = // exposition only |
(2) | (since C++20) |
template<class T, class Cat = std::partial_ordering> concept three_way_comparable = |
(3) | (since C++20) |
template<class T, class U, class Cat = std::partial_ordering> concept three_way_comparable_with = |
(4) | (since C++20) |
__PartiallyOrderedWith<T, U>
specifies that an object of type T
and an object of type U
can be compared a partial order with each other (in either order) using <
, >
, <=
, and >=
, and the results of the comparisons are consistent.T
and U
model __PartiallyOrderedWith<T, U>
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>,
the following are true:
- t < u, t <= u, t > u, t >= u, u < t, u <= t, u > t, and u >= t have the same domain;
- bool(t < u) == bool(u > t);
- bool(u < t) == bool(t > u);
- bool(t <= u) == bool(u >= t); and
- bool(u <= t) == bool(t >= u).
three_way_comparable<T, Cat>
specifies that the three way comparison operator <=>
on T
yield results consistent with the comparison category implied by Cat
.
T
and Cat
model three_way_comparable<T, Cat>
only if, given lvalues a
and b
type const std::remove_reference_t<T>:
- (a <=> b == 0) == bool(a == b);
- (a <=> b != 0) == bool(a != b);
- ((a <=> b) <=> 0) and (0 <=> (b <=> a)) are equal;
- If bool(a < b) and bool(b < c) are both true, then bool(a < c) is true;
- bool(a > b) == bool(b < a);
- bool(a >= b) == !bool(a < b);
- bool(a <= b) == !bool(b < a);
- if
Cat
is convertible to std::strong_equality,T
modelsequality_comparable
; - if
Cat
is convertible to std::partial_ordering:- (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
.
three_way_comparable_with<T, U, Cat>
specifies that the three way comparison operator <=>
on T
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.
Formally, T
, U
, and Cat
model 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));
- if
Cat
is convertible to std::strong_equality,T
andU
model std::equality_comparable_with<T, U>; - if
Cat
is convertible to std::partial_ordering:- (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>.
where __WeaklyEqualityComparableWith
is an exposition-only concept also used by equality_comparable
.
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 requires implicit expression variations.
See also
specifies that operator == is an equivalence relation (concept) | |
specifies that the comparison operators on the type yield a total order (concept) |