std:: equality_comparable, std:: equality_comparable_with
|
Défini dans l'en-tête
<concepts>
|
||
|
template
<
class
T
>
concept equality_comparable = __WeaklyEqualityComparableWith < T, T > ; |
(1) | (depuis C++20) |
|
template
<
class
T,
class
U
>
concept equality_comparable_with
=
|
(2) | (depuis C++20) |
|
Concepts auxiliaires
|
||
|
template
<
class
T,
class
U
>
concept __WeaklyEqualityComparableWith
=
|
(3) | ( exposition uniquement* ) |
| (4) | ||
|
template
<
class
T,
class
U
>
concept __ComparisonCommonTypeWith
=
|
(jusqu'en C++23)
( exposition uniquement* ) |
|
|
template
<
class
T,
class
U,
class
C
=
std::
common_reference_t
<
const
T
&
,
const
U
&
>
>
concept _ComparisonCommonTypeWithImpl
=
|
(depuis C++23)
( exposition uniquement* ) |
|
std::equality_comparable
spécifie que les opérateurs de comparaison
==
et
!=
sur
T
reflètent l'égalité :
==
donne
true
si et seulement si les opérandes sont égaux.
std::equality_comparable_with
spécifie que les opérateurs de comparaison
==
et
!=
sur des opérandes (éventuellement mixtes)
T
et
U
produisent des résultats cohérents avec l'égalité. La comparaison d'opérandes mixtes produit des résultats équivalents à la comparaison des opérandes convertis vers leur type commun.
__WeaklyEqualityComparableWith
spécifie qu'un objet de type
T
et un objet de type
U
peuvent être comparés pour l'égalité l'un avec l'autre (dans les deux ordres) en utilisant à la fois
==
et
!=
, et que les résultats des comparaisons sont cohérents.
__ComparisonCommonTypeWith
spécifie que deux types partagent un type commun, et qu'une lvalue const
ou une rvalue non-const
(depuis C++23)
de l'un ou l'autre type est convertible en ce type commun.
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.
Dans les paragraphes suivants, étant donné une expression
E
et un type
C
,
CONVERT_TO
<
C
>
(
E
)
est défini comme suit :
|
(jusqu'en C++23) |
|
(depuis C++23) |
a
et
b
de type
T
,
bool
(
a
==
b
)
est
true
si et seulement si
a
et
b
sont égaux. Conjointement avec l'exigence que
a
==
b
soit
préservateur d'égalité
, cela implique que
==
est symétrique et transitif, et de plus que
==
est réflexif pour tous les objets
a
qui sont égaux à au moins un autre objet.
-
tett2des lvalues désignant des objets distincts égaux de types const std:: remove_reference_t < T > et std:: remove_cvref_t < T > respectivement, -
uetu2des lvalues désignant des objets distincts égaux de types const std:: remove_reference_t < U > et std:: remove_cvref_t < U > respectivement, -
Csoit std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > ,
l'expression suivante est vraie :
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) .
-
t, une lvalue de type const std:: remove_reference_t < T > et -
u, une lvalue de type const std:: remove_reference_t < U > ,
les conditions suivantes sont vraies :
- t == u , u == t , t ! = u , u ! = t ont le même domaine ;
- bool ( u == t ) == bool ( t == u ) ;
- bool ( t ! = u ) == ! bool ( t == u ) ; et
- bool ( u ! = t ) == bool ( t ! = u ) .
|
Le concept correspondant
|
(jusqu'à C++23) |
|
Soient
les conditions suivantes sont satisfaites :
|
(depuis C++23) |
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 les variations d'expression implicites .
Références
- Norme C++23 (ISO/CEI 14882:2024) :
-
-
18.5.4 Concept
equality_comparable[concept.equalitycomparable]
-
18.5.4 Concept
- Norme C++20 (ISO/CEI 14882:2020) :
-
-
18.5.3 Concept
equality_comparable[concept.equalitycomparable]
-
18.5.3 Concept