std:: totally_ordered, std:: totally_ordered_with
|
Определено в заголовочном файле
<concepts>
|
||
|
template
<
class
T
>
концепт totally_ordered
=
|
(1) | (начиная с C++20) |
|
template
<
class
T,
class
U
>
концепт totally_ordered_with
=
|
(2) | (начиная с C++20) |
|
Вспомогательные концепции
|
||
|
template
<
class
T,
class
U
>
концепт __PartiallyOrderedWith
=
|
(3) | ( только для демонстрации* ) |
std::totally_ordered
определяет, что операторы сравнения
==,!=,<,>,<=,>=
для типа дают результаты, согласованные со
строгим полным порядком
на этом типе.
std::totally_ordered_with
определяет, что операторы сравнения
==,!=,<,>,<=,>=
для (возможно, смешанных) операндов
T
и
U
дают результаты, соответствующие строгому полному порядку. Сравнение смешанных операндов дает результаты, эквивалентные сравнению операндов, преобразованных к их общему типу.
__PartiallyOrderedWith
специфицирует, что значение типа
T
и значение типа
U
могут быть сравнимы в частичном порядке друг с другом (в любом порядке) с использованием
<
,
>
,
<=
, и
>=
, и результаты сравнений являются согласованными.
Содержание |
Семантические требования
Эти концепции моделируются только в том случае, если они удовлетворены и все подчинённые им концепции также моделируются.
a
,
b
и
c
типа
const
std::
remove_reference_t
<
T
>
:
- Ровно одно из выражений bool ( a < b ) , bool ( a > b ) и bool ( a == b ) равно true ;
- Если bool ( a < b ) и bool ( b < c ) оба равны true , тогда bool ( a < c ) равно true ;
- bool ( a > b ) == bool ( b < a )
- bool ( a >= b ) == ! bool ( a < b )
- bool ( a <= b ) == ! bool ( b < a )
-
tиt2, lvalue-выражения, обозначающие различные равные объекты типов const std:: remove_reference_t < T > и std:: remove_reference_t < T > соответственно, и -
uиu2, lvalue-выражения, обозначающие различные равные объекты типов const std:: remove_reference_t < U > и std:: remove_reference_t < U > соответственно,
пусть
C
будет
std::
common_reference_t
<
const
std::
remove_reference_t
<
T
>
&
,
const
std::
remove_reference_t
<
U
>
&
>
, и, для данного выражения
E
и типа
C
, пусть
CONVERT_TO
<
C
>
(
E
)
будет:
|
(до C++23) |
|
(начиная с C++23) |
следующие утверждения верны:
- 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 ) )
` для синтаксической подсветки.
-
любого lvalue
tтипа const std:: remove_reference_t < T > , и -
любого lvalue
uтипа const std:: remove_reference_t < U > ,
выполняются следующие условия:
- t < u , t <= u , t > u , t >= u , u < t , u <= t , u > t , и u >= t имеют одинаковую область определения;
- bool ( t < u ) == bool ( u > t ) ;
- bool ( u < t ) == bool ( t > u ) ;
- bool ( t <= u ) == bool ( u >= t ) ; и
- bool ( u <= t ) == bool ( t >= u ) .
Сохранение равенства
Выражения, объявленные в requires выражениях концепций стандартной библиотеки, должны быть equality-preserving (если не указано иное).
Вариации неявных выражений
Выражение requires expression , использующее выражение, которое является немодифицирующим для некоторого константного lvalue операнда, также требует неявных вариаций выражений .
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
-
18.5.5 Концепт
totally_ordered[concept.totallyordered]
-
18.5.5 Концепт
- Стандарт C++20 (ISO/IEC 14882:2020):
-
-
18.5.4 Концепт
totally_ordered[concept.totallyordered]
-
18.5.4 Концепт
Смотрите также
|
указывает, что оператор
<=>
производит согласованный результат для заданных типов
(концепт) |