Namespaces
Variants

std:: totally_ordered, std:: totally_ordered_with

From cppreference.net
Défini dans l'en-tête <concepts>
template < class T >

concept totalement_ordonné =

std:: equality_comparable < T > && __PartiallyOrderedWith < T, T > ;
(1) (depuis C++20)
template < class T, class U >

concept totalement_ordonné_avec =
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 > & >> &&

__PartiellementOrdonnéAvec < T, U > ;
(2) (depuis C++20)
Concepts auxiliaires
template < class T, class U >

concept __PartiellementOrdonnéAvec =
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) ( exposition uniquement* )
1) Le concept std::totally_ordered spécifie que les opérateurs de comparaison ==,!=,<,>,<=,>= sur un type produisent des résultats cohérents avec un ordre total strict sur le type.
2) Le concept std::totally_ordered_with spécifie que les opérateurs de comparaison ==,!=,<,>,<=,>= sur des opérandes (éventuellement mixtes) T et U produisent des résultats cohérents avec un ordre total strict. La comparaison d'opérandes mixtes produit des résultats équivalents à la comparaison des opérandes convertis en leur type commun.
3) Le concept d'exposition uniquement __PartiallyOrderedWith spécifie qu'une valeur de type T et une valeur de type U peuvent être comparées selon un ordre partiel l'une avec l'autre (dans les deux sens) en utilisant < , > , <= , et >= , et que les résultats des comparaisons sont cohérents.

Table des matières

Exigences sémantiques

Ces concepts sont modélisés uniquement s'ils sont satisfaits et si tous les concepts qu'ils subsument sont modélisés.

1) std :: totally_ordered < T > est modélisé seulement si, étant donné des lvalues a , b et c de type const std:: remove_reference_t < T > :
  • Exactement une des expressions bool ( a < b ) , bool ( a > b ) et bool ( a == b ) est true ;
  • Si bool ( a < b ) et bool ( b < c ) sont toutes deux true , alors bool ( a < c ) est 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

Soit C le type std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > , et, étant donnée une expression E et un type C , soit CONVERT_TO < C > ( E ) défini comme suit :

(jusqu'en C++23)
  • static_cast < const C & > ( std:: as_const ( E ) ) si cela constitue une expression valide,
  • static_cast < const C & > ( std :: move ( E ) ) sinon.
(depuis C++23)

les affirmations suivantes sont vraies :

  • 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 > est modélisé seulement si, étant donnés

les conditions suivantes sont vraies :

  • t < u , t <= u , t > u , t >= u , u < t , u <= t , u > t , et u >= t ont le même domaine ;
  • bool ( t < u ) == bool ( u > t ) ;
  • bool ( u < t ) == bool ( t > u ) ;
  • bool ( t <= u ) == bool ( u >= t ) ; et
  • bool ( u <= t ) == bool ( t >= u ) .

Préservation de l'égalité

Les expressions déclarées dans les requires expressions des concepts de la bibliothèque standard doivent être equality-preserving (sauf indication contraire).

Variations d'expression implicites

Une requires expression qui utilise une expression non modifiante pour un opérande constant lvalue requiert également les variations d'expression implicites .

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 18.5.5 Concept totally_ordered [concept.totallyordered]
  • Norme C++20 (ISO/IEC 14882:2020) :
  • 18.5.4 Concept totally_ordered [concept.totallyordered]

Voir aussi

spécifie que l'opérateur <=> produit un résultat cohérent sur les types donnés
(concept)