std:: totally_ordered, std:: totally_ordered_with
Defined in header
<concepts>
|
||
template
<
class
T
>
concept totally_ordered
=
|
(1) | (since C++20) |
template
<
class
T,
class
U
>
concept totally_ordered_with
=
|
(2) | (since C++20) |
Helper concepts
|
||
template
<
class
T,
class
U
>
concept __PartiallyOrderedWith
=
|
(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.
a
,
b
and
c
of type
const
std::
remove_reference_t
<
T
>
:
- Exactly one of bool ( a < b ) , bool ( a > b ) and bool ( a == b ) is true ;
- 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 )
-
t
andt2
, lvalues denoting distinct equal objects of types const std:: remove_reference_t < T > and std:: remove_reference_t < T > respectively, and -
u
andu2
, lvalues denoting distinct equal objects of types const std:: remove_reference_t < U > and std:: 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 ) )
-
any lvalue
t
of type const std:: remove_reference_t < T > , and -
any lvalue
u
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 ) .
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
See also
specifies that operator
<=>
produces consistent result on given types
(concept) |