std:: three_way_comparable, std:: three_way_comparable_with
|
Défini dans l'en-tête
<compare>
|
||
|
template
<
class
T,
class
Cat
=
std::
partial_ordering
>
concept three_way_comparable
=
|
(1) | (depuis C++20) |
|
template
<
class
T,
class
U,
class
Cat
=
std::
partial_ordering
>
concept three_way_comparable_with
=
|
(2) | (depuis C++20) |
|
template
<
class
T,
class
Cat
>
concept __ComparesAs
=
|
(3) | ( exposition uniquement* ) |
std::three_way_comparable
spécifie que l'opérateur de comparaison à trois voies
<=>
sur
T
produit des résultats cohérents avec la catégorie de comparaison impliquée par
Cat
.
std::three_way_comparable_with
spécifie que l'opérateur de comparaison à trois voies
<=>
sur des opérandes (éventuellement mixtes)
T
et
U
produit des résultats cohérents avec la catégorie de comparaison impliquée par
Cat
. La comparaison d'opérandes mixtes produit des résultats équivalents à la comparaison des opérandes convertis en leur type commun.
__WeaklyEqualityComparableWith
,
__PartiallyOrderedWith
, et
__ComparisonCommonTypeWith
sont des concepts d'exposition uniquement. Voir les descriptions de
equality_comparable
et
totally_ordered
.
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.
T
et
Cat
modélisent
std
::
three_way_comparable
<
T, Cat
>
seulement si, étant donné des lvalues
a
et
b
de type
const
std::
remove_reference_t
<
T
>
, les conditions suivantes sont vraies :
- ( a <=> b == 0 ) == bool ( a == b ) ,
- ( a <=> b ! = 0 ) == bool ( a ! = b ) ,
- ( ( a <=> b ) <=> 0 ) et ( 0 <=> ( b <=> a ) ) sont égaux,
- bool ( a > b ) == bool ( b < a ) ,
- bool ( a >= b ) == ! bool ( a < b ) ,
- bool ( a <= b ) == ! bool ( b < a ) ,
- ( a <=> b < 0 ) == bool ( a < b ) ,
- ( a <=> b > 0 ) == bool ( a > b ) ,
- ( a <=> b <= 0 ) == bool ( a <= b ) , et
- ( a <=> b >= 0 ) == bool ( a >= b ) , et
-
si
Catest convertible en std::strong_ordering ,Tmodélisetotally_ordered.
T
,
U
, and
Cat
model
std
::
three_way_comparable_with
<
T, U, Cat
>
only if given
-
tett2, des lvalues désignant des objets distincts mais égaux de types const std:: remove_reference_t < T > et std:: remove_reference_t < T > respectivement, et -
uetu2, des lvalues désignant des objets distincts mais égaux de types const std:: remove_reference_t < U > et std:: remove_reference_t < U > respectivement.
Soit
C
le type
std::
common_reference_t
<
const
std::
remove_reference_t
<
T
>
&
,
const
std::
remove_reference_t
<
U
>
&
>
et étant donné une expression
E
et un type
C
, soit
CONVERT_TO
<
C
>
(
E
)
défini comme suit :
|
(jusqu'à C++23) |
|
(depuis C++23) |
les affirmations suivantes sont vraies :
- t <=> u et u <=> t ont le même domaine,
- ( ( t <=> u ) <=> 0 ) et ( 0 <=> ( u <=> t ) ) sont égaux,
- ( t <=> u == 0 ) == bool ( t == u ) ,
- ( t <=> u ! = 0 ) == bool ( t ! = u ) ,
- Cat ( t <=> u ) == Cat ( CONVERT_TO < C > ( t2 ) <=> CONVERT_TO < C > ( u2 ) ) ,
- ( t <=> u < 0 ) == bool ( t < u ) ,
- ( t <=> u > 0 ) == bool ( t > u ) ,
- ( t <=> u <= 0 ) == bool ( t <= u ) ,
- ( t <=> u >= 0 ) == bool ( t >= u ) , et
-
si
Catest convertible en std::strong_ordering ,TetUmodélisent std:: totally_ordered_with < 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'expressions implicites
Une requires expression qui utilise une expression non modifiante pour un opérande constant lvalue requiert également des variations d'expression implicites .
Voir aussi
|
spécifie que l'opérateur
==
est une relation d'équivalence
(concept) |
|
|
spécifie que les opérateurs de comparaison sur le type produisent un ordre total
(concept) |