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 =
std::equality_comparable<T> &&
std::equality_comparable<U> &&
__ComparisonCommonTypeWith<T, U> &&
std::equality_comparable<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__WeaklyEqualityComparableWith<T, U>;
|
(2) | (depuis C++20) |
| Concepts auxiliaires |
||
template< class T, class U >
concept __WeaklyEqualityComparableWith =
requires(const std::remove_reference_t<T>& t,
const std::remove_reference_t<U>& u) {
{ t == u } -> boolean-testable;
{ t != u } -> boolean-testable;
{ u == t } -> boolean-testable;
{ u != t } -> boolean-testable;
};
|
(3) | (exposé uniquement*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (jusqu'à C++23) (exposé uniquement*) |
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >
concept _ComparisonCommonTypeWithImpl =
std::same_as<std::common_reference_t<const T&, const U&>,
std::common_reference_t<const U&, const T&>> &&
requires {
requires std::convertible_to<const T&, const C&> ||
std::convertible_to<T, const C&>;
requires std::convertible_to<const U&, const C&> ||
std::convertible_to<U, const C&>;
};
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
|
(depuis C++23) (exposé 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é. Comparer des opérandes mixtes donne des résultats équivalents à la comparaison des opérandes convertis à 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é entre eux (dans les deux ordres) en utilisant à la fois == et !=, et les résultats des comparaisons sont cohérents.__ComparisonCommonTypeWith spécifie que deux types partagent un type commun, et une lvalue const ou une rvalue non-const(depuis C++23) de chaque type est convertible en ce type commun.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