Namespaces
Variants

std:: totally_ordered, std:: totally_ordered_with

From cppreference.net
定义于头文件 <concepts>
template < class T >

concept totally_ordered =

std:: equality_comparable < T > && __PartiallyOrderedWith < T, T > ;
(1) (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) (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) ( 仅用于说明* )
1) 概念 std::totally_ordered 规定:类型的比较运算符 ==,!=,<,>,<=,>= 产生的结果与该类型上的 严格全序关系 保持一致。
2) 概念 std::totally_ordered_with 规定:当对(可能混合的) T U 操作数使用比较运算符 ==,!=,<,>,<=,>= 时,其结果与严格全序保持一致。混合操作数的比较结果应等价于将操作数转换为其公共类型后的比较结果。
3) 仅用于阐述的概念 __PartiallyOrderedWith 规定:类型 T 的值与类型 U 的值可通过 < > <= >= 运算符在偏序关系中进行相互比较(以任意顺序),且比较结果具有一致性。

目录

语义要求

这些概念仅在它们被满足且所有它们所包含的概念都被建模时才会被建模。

1) std :: totally_ordered < T > 仅在满足以下条件时被建模,给定类型为 const std:: remove_reference_t < T > 的左值 a b c
  • 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 > 仅在满足以下条件时被建模:

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 起)

以下表达式均为 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 > 仅在满足以下条件时成立:

以下条件均为真:

  • 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 表达式 中声明的表达式必须满足 等值保持 要求(除非另有说明)。

隐式表达式变体

对于某个常量左值操作数使用非修改表达式的 requires 表达式 ,同时要求具备 隐式表达式变体

参考文献

  • 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]

参见

规定 <=> 运算符在给定类型上产生一致结果
(概念)