Namespaces
Variants

std:: totally_ordered, std:: totally_ordered_with

From cppreference.net
(注:指定されたHTML要素には翻訳対象のテキストコンテンツが含まれていないため、元の構造を保持したまま出力します)
定義ヘッダー <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 ) のうち、ちょうど1つが 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 ) )
**注記**: 提供されたHTMLコード内のテキストはすべてC++コード(` `タグ内)であり、指示に従って翻訳対象外としました。HTMLタグ・属性の保持、` `/`
`/``タグ内テキストの非翻訳、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 expressions で宣言される式は、 equality-preserving であることが要求されます(特に明記されている場合を除く)。

暗黙的な式のバリエーション

定数左辺値オペランドに対して非変更式を使用する requires expression は、 暗黙的な式バリエーション も要求します。

参考文献

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

関連項目

指定された型に対して <=> 演算子が一貫した結果を生成することを指定する
(コンセプト)