Namespaces
Variants

std:: totally_ordered, std:: totally_ordered_with

From cppreference.net
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
Определено в заголовочном файле <concepts>
template < class T >

концепт totally_ordered =

std:: equality_comparable < T > && __PartiallyOrderedWith < T, T > ;
(1) (начиная с C++20)
template < class T, class U >

концепт 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) (начиная с C++20)
Вспомогательные концепции
template < class T, class U >

концепт __PartiallyOrderedWith =
требует ( 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) ( только для демонстрации* )
1) Концепт std::totally_ordered определяет, что операторы сравнения ==,!=,<,>,<=,>= для типа дают результаты, согласованные со строгим полным порядком на этом типе.
2) Концепт std::totally_ordered_with определяет, что операторы сравнения ==,!=,<,>,<=,>= для (возможно, смешанных) операндов T и U дают результаты, соответствующие строгому полному порядку. Сравнение смешанных операндов дает результаты, эквивалентные сравнению операндов, преобразованных к их общему типу.
3) Экспозиционное понятие __PartiallyOrderedWith специфицирует, что значение типа T и значение типа U могут быть сравнимы в частичном порядке друг с другом (в любом порядке) с использованием < , > , <= , и >= , и результаты сравнений являются согласованными.

Содержание

Семантические требования

Эти концепции моделируются только в том случае, если они удовлетворены и все подчинённые им концепции также моделируются.

1) std :: totally_ordered < T > моделируется только тогда, когда для lvalue-выражений 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 )
2) std :: totally_ordered_with < T, U > is modeled only if, given

пусть 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)
  • static_cast < const C & > ( std:: as_const ( E ) ) если это допустимое выражение,
  • static_cast < const C & > ( std :: move ( E ) ) в противном случае.
(начиная с 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 ) )
**Примечание:** Весь код C++ оставлен без изменений в соответствии с инструкциями, так как он находится внутри тегов ` `, которые эквивалентны тегам ` ` для синтаксической подсветки.
3) __PartiallyOrderedWith < 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]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 18.5.4 Концепт totally_ordered [concept.totallyordered]

Смотрите также

указывает, что оператор <=> производит согласованный результат для заданных типов
(концепт)