std::totally_ordered, std::totally_ordered_with - cppreference.com
From cppreference.com
| Defined in header |
||
|
|
(1) | (since C++20) |
|
|
(2) | (since C++20) |
| Helper concepts |
||
|
|
(3) | (exposition only*) |
1) The concept std::totally_ordered specifies that the comparison operators ==,!=,<,>,<=,>= on a type yield results consistent with a strict total order on the type.
2) The concept 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.
3) The exposition-only concept __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)
2) std::totally_ordered_with<T, U> is modeled only if, given
tandt2, lvalues denoting distinct equal objects of typesconst std::remove_reference_t<T>andstd::remove_reference_t<T>respectively, anduandu2, 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))
3) __PartiallyOrderedWith<T, U> is modeled only if given
- any lvalue
tof typeconst std::remove_reference_t<T>, and - any lvalue
uof 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 >= thave the same domain;bool(t < u) == bool(u > t);bool(u < t) == bool(t > u);bool(t <= u) == bool(u >= t); andbool(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.
References
- C++23 standard (ISO/IEC 14882:2024):
- 18.5.5 Concept
totally_ordered[concept.totallyordered]
- 18.5.5 Concept
- C++20 standard (ISO/IEC 14882:2020):
- 18.5.4 Concept
totally_ordered[concept.totallyordered]
- 18.5.4 Concept