On this page
std::three_way_comparable, std::three_way_comparable_with
Defined in header <compare> |
||
---|---|---|
|
(1) | (since C++20) |
|
(2) | (since C++20) |
|
(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.
__WeaklyEqualityComparableWith
, __PartiallyOrderedWith
, and __ComparisonCommonTypeWith
are exposition-only concepts. See descriptions of equality_comparable
and totally_ordered
.
Semantic requirements
These concepts are modeled only if they are satisfied and all concepts they subsume are modeled.
1)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 tostd::strong_ordering
,T
modelstotally_ordered
.
T
, U
, and Cat
model std::three_way_comparable_with<T, U, Cat>
only if given
t
andt2
, lvalues denoting distinct equal objects of typesconst std::remove_reference_t<T>
andstd::remove_reference_t<T>
respectively, andu
andu2
, lvalues denoting distinct equal objects of typesconst std::remove_reference_t<U>
andstd::remove_reference_t<U>
respectively.
Let C
be std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>
and given an expression E
and a type C
, let CONVERT_TO<C>(E)
be:
|
(until C++23) |
|
(since C++23) |
the following are true:
t <=> u
andu <=> 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(CONVERT_TO<C>(t2) <=> CONVERT_TO<C>(u2))
,(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 tostd::strong_ordering
,T
andU
modelstd::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 requires implicit expression variations.
See also
(C++20)
|
specifies that operator == is an equivalence relation (concept) |
(C++20)
|
specifies that the comparison operators on the type yield a total order (concept) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/compare/three_way_comparable