std::totally_ordered, std::totally_ordered_with
Defined in header <concepts> | ||
---|---|---|
template< class T > concept totally_ordered = std::equality_comparable<T> && __PartiallyOrderedWith<T, T>; | (1) | (since C++20) |
template< class T, class U > concept totally_ordered_with = std::totally_ordered<T> && std::totally_ordered<U> && std::equality_comparable_with<T, U> && std::totally_ordered< std::common_reference_t< const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>> && __PartiallyOrderedWith<T, U>; | (2) | (since C++20) |
template< class T, class U > concept __PartiallyOrderedWith = requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) { { t < u } -> boolean-testable; { t > u } -> boolean-testable; { t <= u } -> boolean-testable; { t >= u } -> boolean-testable; { u < t } -> boolean-testable; { u > t } -> boolean-testable; { u <= t } -> boolean-testable; { u >= t } -> boolean-testable; }; | (3) | (exposition only*) |
std::totally_ordered
specifies that the comparison operators ==,!=,<,>,<=,>=
on a type yield results consistent with a strict total order on the type.std::totally_ordered_with
specifies that the comparison operators ==,!=,<,>,<=,>=
on (possibly mixed) T
and U
operands yield results consistent with a strict total order. Comparing mixed operands yields results equivalent to comparing the operands converted to their common type.__PartiallyOrderedWith
specifies that a value of type T
and a value of type U
can be compared in a partial order with each other (in either order) using <
, >
, <=
, and >=
, and the results of the comparisons are consistent.Semantic requirements
These concepts are modeled only if they are satisfied and all concepts they subsume are modeled.
1)std::totally_ordered<T>
is modeled only if, given lvalues a
, b
and c
of type const std::remove_reference_t<T>
: - Exactly one of
bool(a < b)
,bool(a > b)
andbool(a == b)
istrue
; - If
bool(a < b)
andbool(b < c)
are bothtrue
, thenbool(a < c)
istrue
; -
bool(a > b) == bool(b < a)
-
bool(a >= b) == !bool(a < b)
-
bool(a <= b) == !bool(b < a)
std::totally_ordered_with<T, U>
is modeled only if, given -
t
andt2
, lvalues denoting distinct equal objects of typesconst std::remove_reference_t<T>
andstd::remove_reference_t<T>
respectively, and -
u
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:
-
bool(t < u) == bool(CONVERT_TO<C>(t2) < CONVERT_TO<C>(u2))
-
bool(t > u) == bool(CONVERT_TO<C>(t2) > CONVERT_TO<C>(u2))
-
bool(t <= u) == bool(CONVERT_TO<C>(t2) <= CONVERT_TO<C>(u2))
-
bool(t >= u) == bool(CONVERT_TO<C>(t2) >= CONVERT_TO<C>(u2))
-
bool(u < t) == bool(CONVERT_TO<C>(u2) < CONVERT_TO<C>(t2))
-
bool(u > t) == bool(CONVERT_TO<C>(u2) > CONVERT_TO<C>(t2))
-
bool(u <= t) == bool(CONVERT_TO<C>(u2) <= CONVERT_TO<C>(t2))
-
bool(u >= t) == bool(CONVERT_TO<C>(u2) >= CONVERT_TO<C>(t2))
__PartiallyOrderedWith<T, U>
is modeled only if given - any lvalue
t
of typeconst std::remove_reference_t<T>
, and - any lvalue
u
of typeconst std::remove_reference_t<U>
,
the following are true:
-
t < u
,t <= u
,t > u
,t >= u
,u < t
,u <= t
,u > t
, andu >= 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)
.
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 <=> produces consistent result on given types (concept) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/concepts/totally_ordered