Namespaces
Variants

std::experimental::ranges:: StrictTotallyOrdered, std::experimental::ranges:: StrictTotallyOrderedWith

From cppreference.net
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises ` ` qui sont considérées comme du code. Seul le texte en dehors des balises de code aurait dû être traduit, mais dans cet extrait, tout le contenu textuel fait partie du code C++ et doit donc être préservé tel quel.
Défini dans l'en-tête <experimental/ranges/concepts>
template < class T >

concept bool StrictTotallyOrdered =
EqualityComparable < T > &&
requires ( const std:: remove_reference_t < T > & a,
const std:: remove_reference_t < T > & b ) {
{ a < b } - > Boolean && ;
{ a > b } - > Boolean && ;
{ a <= b } - > Boolean && ;
{ a >= b } - > Boolean && ;

} ;
(1) (ranges TS)
template < class T, class U >

concept bool StrictTotallyOrderedWith =
StrictTotallyOrdered < T > &&
StrictTotallyOrdered < U > &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
StrictTotallyOrdered <
ranges:: common_reference_t <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & >> &&
EqualityComparableWith < T, U > &&
requires ( const std:: remove_reference_t < T > & t,
const std:: remove_reference_t < U > & u ) {
{ t < u } - > Boolean && ;
{ t > u } - > Boolean && ;
{ t <= u } - > Boolean && ;
{ t >= u } - > Boolean && ;
{ u < t } - > Boolean && ;
{ u > t } - > Boolean && ;
{ u <= t } - > Boolean && ;
{ u >= t } - > Boolean && ;

} ;
(2) (ranges TS)
1) Le concept StrictTotallyOrdered<T> spécifie que les opérateurs de comparaison ==,!=,<,>,<=,>= sur T produisent des résultats cohérents avec un ordre total strict sur T .

StrictTotallyOrdered<T> est satisfait 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 tous 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) Le concept StrictTotallyOrderedWith<T, U> spécifie que les opérateurs de comparaison ==,!=,<,>,<=,>= sur des opérandes (éventuellement mixtes) de types 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 vers leur type commun.

Formellement, StrictTotallyOrderedWith<T, U> est satisfait seulement si, étant donné toute lvalue t de type const std:: remove_reference_t < T > et toute lvalue u de type const std:: remove_reference_t < U > , et soit C le type ranges:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > :

  • bool ( t < u ) == bool ( C ( t ) < C ( u ) )
  • bool ( t > u ) == bool ( C ( t ) > C ( u ) )
  • bool ( t <= u ) == bool ( C ( t ) <= C ( u ) )
  • bool ( t >= u ) == bool ( C ( t ) >= C ( u ) )
  • bool ( u < t ) == bool ( C ( u ) < C ( t ) )
  • bool ( u > t ) == bool ( C ( u ) > C ( t ) )
  • bool ( u <= t ) == bool ( C ( u ) <= C ( t ) )
  • bool ( u >= t ) == bool ( C ( u ) >= C ( t ) )

Préservation de l'égalité

Une expression est préservatrice d'égalité si elle produit des résultats égaux pour des entrées égales.

  • Les entrées d'une expression consistent en ses opérandes.
  • Les sorties d'une expression consistent en son résultat et tous les opérandes modifiés par l'expression (le cas échéant).

Toute expression devant préserver l'égalité doit en outre être stable : deux évaluations d'une telle expression avec les mêmes objets d'entrée doivent produire des sorties égales en l'absence de toute modification explicite intervenue entre-temps de ces objets d'entrée.

Sauf indication contraire, toute expression utilisée dans une requires-expression doit être égalité-préservante et stable, et l'évaluation de l'expression ne peut modifier que ses opérandes non constants. Les opérandes constants ne doivent pas être modifiés.

Variations d'expression implicite

Une requires-expression qui utilise une expression non modifiante pour un opérande lvalue constant implique également implicitement des variations supplémentaires de cette expression qui acceptent une lvalue non constante ou une rvalue (éventuellement constante) pour l'opérande donné, sauf si une telle variation d'expression est explicitement requise avec une sémantique différente. Ces variations d'expression implicites doivent satisfaire aux mêmes exigences sémantiques que l'expression déclarée. La mesure dans laquelle une implémentation valide la syntaxe des variations n'est pas spécifiée.