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
__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.
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))
- 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)
- (a <=> b >= 0 ) == bool (a >= b)
- 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
andt2
, lvalues denoting distinct equal objects of types const std::remove_reference_t <T> and std::remove_reference_t<T> -
u
andu2
, lvalues denoting distinct equal objects of types const std::remove_reference_t <U> and std::remove_reference_t<U>
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)
|
(until C++23) |
|
(since C++23) |
the following are true:
- t <=> u and u <=> t
- ((t <=> u) <=> 0) and (0 <=> (u <=> t))
- (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)
- 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
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) |