Comparison operators
Compare les arguments.
| Nom de l'opérateur | Syntaxe | Surcharge able | Exemples de prototypes (pour class T ) | |
|---|---|---|---|---|
| Définition à l'intérieur de la classe | Définition à l'extérieur de la classe | |||
| Égal à |
a == b
|
Oui | bool T :: operator == ( const U & b ) const ; | bool operator == ( const T & a, const U & b ) ; |
| Différent de |
a != b
|
Oui | bool T :: operator ! = ( const U & b ) const ; | bool operator ! = ( const T & a, const U & b ) ; |
| Inférieur à |
a < b
|
Oui | bool T :: operator < ( const U & b ) const ; | bool operator < ( const T & a, const U & b ) ; |
| Supérieur à |
a > b
|
Oui | bool T :: operator > ( const U & b ) const ; | bool operator > ( const T & a, const U & b ) ; |
| Inférieur ou égal à |
a <= b
|
Oui | bool T :: operator <= ( const U & b ) const ; | bool operator <= ( const T & a, const U & b ) ; |
| Supérieur ou égal à |
a >= b
|
Oui | bool T :: operator >= ( const U & b ) const ; | bool operator >= ( const T & a, const U & b ) ; |
| Comparaison à trois voies (C++20) |
a <=> b
|
Oui |
R
T
::
operator
<=>
(
const
U
&
b
)
const
;
[1]
|
R
operator
<=>
(
const
T
&
a,
const
U
&
b
)
;
[1]
|
|
||||
Table des matières |
Comparaison bidirectionnelle
Les expressions d'opérateur de comparaison bidirectionnelle ont la forme
Opérateurs relationnels
lhs
<
rhs
|
(1) | ||||||||
lhs
>
rhs
|
(2) | ||||||||
lhs
<=
rhs
|
(3) | ||||||||
lhs
>=
rhs
|
(4) | ||||||||
Opérateurs d'égalité
lhs
==
rhs
|
(5) | ||||||||
lhs
!=
rhs
|
(6) | ||||||||
Opérateurs de comparaison bidirectionnels intégrés
Pour les opérateurs de comparaison bidirectionnels intégrés, les conversions lvalue-vers-rvalue , les conversions tableau-vers-pointeur (jusqu'à C++26) et les conversions fonction-vers-pointeur sont appliquées à lhs et rhs .
|
La comparaison est dépréciée si les deux lhs et rhs ont un type tableau avant l'application de ces conversions. |
(since C++20)
(until C++26) |
|
Pour les opérateurs relationnels intégrés, si l'un des opérandes est un pointeur, la conversion tableau-vers-pointeur est effectuée sur l'autre opérande. Pour les opérateurs d'égalité intégrés, si l'un des opérandes est un pointeur ou une constante de pointeur nul , la conversion tableau-vers-pointeur est effectuée sur l'autre opérande. |
(since C++26) |
Pour les opérateurs de comparaison bidirectionnels intégrés, le résultat est une bool prvalue.
Comparaison arithmétique intégrée
Si les opérandes converties ont toutes deux un type arithmétique ou énumération (scopé ou non scopé), les conversions arithmétiques usuelles sont effectuées sur les deux opérandes. Les valeurs sont comparées après les conversions :
#include <iostream> int main() { static_assert(sizeof(unsigned char) < sizeof(int), "Cannot compare signed and smaller unsigned properly"); int a = -1; int b = 1; unsigned int c = 1; unsigned char d = 1; std::cout << std::boolalpha << "Comparing two signed values:\n" " -1 == 1 ? " << (a == b) << "\n" " -1 < 1 ? " << (a < b) << "\n" " -1 > 1 ? " << (a > b) << "\n" "Comparing signed and unsigned:\n" // may issue different-signedness warning: " -1 == 1 ? " << (a == c) << "\n" // may issue different-signedness warning: " -1 < 1 ? " << (a < c) << "\n" // may issue different-signedness warning: " -1 > 1 ? " << (a > c) << "\n" "Comparing signed and smaller unsigned:\n" " -1 == 1 ? " << (a == d) << "\n" " -1 < 1 ? " << (a < d) << "\n" " -1 > 1 ? " << (a > d) << '\n'; }
Sortie :
Comparaison de deux valeurs signées : -1 == 1 ? false -1 < 1 ? true -1 > 1 ? false Comparaison entre signé et non signé : -1 == 1 ? false -1 < 1 ? false -1 > 1 ? true Comparaison entre signé et non signé plus petit : -1 == 1 ? false -1 < 1 ? true -1 > 1 ? false
Comparaison d'égalité des pointeurs intégrée
Les opérandes converties des opérateurs d'égalité
==
et
!=
peuvent également avoir
le type
std::nullptr_t
,
(depuis C++11)
un type pointeur ou un type pointeur-sur-membre.
La comparaison d'égalité des pointeurs natifs a trois résultats possibles : égal, inégal et non spécifié. Les valeurs produites par les opérateurs d'égalité pour la comparaison d'égalité des pointeurs natifs sont listées ci-dessous :
|
Résultat de la comparaison
de p et q |
Valeur produite par | |
|---|---|---|
| p == q | p ! = q | |
| égal | true | false |
| inégal | false | true |
| non spécifié | valeur bool non spécifiée | |
Si au moins l'un des lhs et rhs convertis est un pointeur, les conversions de pointeur , les conversions de pointeur de fonction (depuis C++17) et les conversions de qualification sont effectuées sur les deux opérandes convertis pour les amener à leur type de pointeur composite . Les deux pointeurs du type de pointeur composite sont comparés comme suit :
- Si un pointeur représente l'adresse d'un objet complet, et un autre pointeur
-
- représente l'adresse au-delà de la fin d'un autre objet complet non-tableau, ou
- représente l'adresse juste après le dernier élément d'un autre objet tableau complet,
- le résultat de la comparaison n'est pas spécifié.
- Sinon, si les pointeurs sont tous deux nuls, pointent vers la même fonction, ou représentent la même adresse (c'est-à-dire qu'ils pointent ou sont au-delà de la fin du même objet), ils se comparent égaux.
- Sinon, les pointeurs se comparent inégaux.
Si au moins l'un des lhs et rhs convertis est un pointeur vers membre, les conversions pointeur-vers-membre , les conversions de pointeur de fonction (depuis C++17) et les conversions de qualification sont effectuées sur les deux opérandes convertis pour les amener à leur type de pointeur composite . Les deux pointeurs vers membres du type de pointeur composite sont comparés comme suit :
- Si deux pointeurs vers des membres sont tous deux la valeur de pointeur de membre nul, ils sont égaux.
- Si un seul des deux pointeurs vers des membres est la valeur de pointeur de membre nul, ils sont inégaux.
- Si l'un des deux est un pointeur vers une fonction membre virtuelle , le résultat est non spécifié.
-
Si l'un se réfère à un membre de la classe
C1et l'autre à un membre d'une classe différenteC2, où aucune n'est une classe de base de l'autre, le résultat est non spécifié. - Si les deux se réfèrent à des membres (éventuellement différents) de la même union , ils sont égaux.
- Sinon, deux pointeurs vers des membres sont égaux s'ils se réfèrent au même membre du même objet le plus dérivé ou du même sous-objet si une indirection avec un objet hypothétique du type de classe associé était effectuée, sinon ils sont inégaux.
struct P {}; struct Q : P { int x; }; struct R : P { int x; }; int P::*bx = (int(P::*)) &Q::x; int P::*cx = (int(P::*)) &R::x; bool b1 = (bx == cx); // non spécifié struct B { int f(); }; struct L : B {}; struct R : B {}; struct D : L, R {}; int (B::*pb)() = &B::f; int (L::*pl)() = pb; int (R::*pr)() = pb; int (D::*pdl)() = pl; int (D::*pdr)() = pr; bool x = (pdl == pdr); // faux bool y = (pb == pl); // vrai
|
Deux opérandes de type std::nullptr_t ou un opérande de type std::nullptr_t et l'autre une constante de pointeur nul sont égaux. |
(depuis C++11) |
Comparaison relationnelle des pointeurs intégrés
Les opérandes converties des opérateurs relationnels
>
,
<
,
>=
et
<=
peuvent également avoir un type pointeur.
La comparaison relationnelle intégrée des pointeurs sur des pointeurs inégaux p et q a trois résultats possibles : p est supérieur, q est supérieur et non spécifié. Les valeurs produites par les opérateurs relationnels pour la comparaison relationnelle des pointeurs intégrés sont listées ci-dessous :
|
Résultat de comparaison
de p et q |
Valeur produite par | |||
|---|---|---|---|---|
| p > q | p < q | p >= q | p <= q | |
| égal | false | false | true | true |
| p est plus grand | true | false | true | false |
| q est plus grand | false | true | false | true |
| non spécifié | valeur bool non spécifiée | |||
Si les lhs et rhs convertis sont tous deux des pointeurs, les conversions de pointeurs , les conversions de pointeurs de fonctions (depuis C++17) et les conversions de qualifications sont effectuées sur les deux opérandes convertis pour les amener à leur type de pointeur composite . Les deux pointeurs du type de pointeur composite sont comparés comme suit :
- Si les pointeurs sont égaux ou que le résultat de la comparaison d'égalité n'est pas spécifié, le résultat de la comparaison relationnelle tombe dans la même catégorie.
- Sinon (les pointeurs sont inégaux), si l'un des pointeurs n'est pas un pointeur vers un objet, le résultat n'est pas spécifié.
- Sinon (les deux pointeurs pointent vers des objets), le résultat est défini en termes d'un ordre partiel cohérent avec les règles suivantes :
-
- Étant donné deux éléments différents high et low d'un tableau tels que high a un indice supérieur à low , si un pointeur pointe vers high (ou un sous-objet de high ) et l'autre pointeur pointe vers low (ou un sous-objet de low ), le premier compare supérieur au second.
- Si un pointeur pointe vers un élément elem (ou vers un sous-objet de elem ) d'un tableau, et l'autre pointeur est au-delà de la fin du même tableau, le pointeur après-la-fin compare supérieur à l'autre pointeur.
- Si un pointeur pointe vers un objet complet, un sous-objet de classe de base ou un sous-objet membre obj (ou vers un sous-objet de obj ), et l'autre pointeur est au-delà de la fin de obj , le pointeur après-la-fin compare supérieur à l'autre pointeur.
-
- Si les pointeurs pointent vers différents non-zero-sized (since C++20) membres de données non statiques avec le même member access (until C++23) du même objet d'un type classe non-union, ou vers des sous-objets de tels membres, récursivement, le pointeur vers le membre déclaré plus tard compare supérieur à l'autre pointeur.
- Sinon, le résultat n'est pas spécifié.
Ordre total des pointeurs
Il existe un ordre total strict défini par l'implémentation sur les pointeurs dans chaque programme. L'ordre total strict est cohérent avec l'ordre partiel décrit ci-dessus : les résultats non spécifiés deviennent définis par l'implémentation, tandis que les autres résultats restent inchangés.
La comparaison de pointeurs avec l'ordre total strict est appliquée dans les cas suivants :
- Appeler l' operator ( ) des spécialisations de type pointeur de std::less , std::greater , std::less_equal , et std::greater_equal .
|
(depuis C++14) |
|
(depuis C++20) |
Surcharges
Dans la
résolution de surcharge pour les opérateurs définis par l'utilisateur
, pour chaque paire de types arithmétiques promus
L
et
R
, y compris les types énumération, les signatures de fonction suivantes participent à la résolution de surcharge :
|
bool
operator
<
(
L, R
)
;
|
||
|
bool
operator
>
(
L, R
)
;
|
||
|
bool
operator
<=
(
L, R
)
;
|
||
|
bool
operator
>=
(
L, R
)
;
|
||
|
bool
operator
==
(
L, R
)
;
|
||
|
bool
operator
!
=
(
L, R
)
;
|
||
Pour chaque type
P
qui est soit un pointeur vers un objet soit un pointeur vers une fonction, les signatures de fonction suivantes participent à la résolution de surcharge :
|
bool
operator
<
(
P, P
)
;
|
||
|
bool
operator
>
(
P, P
)
;
|
||
|
bool
operator
<=
(
P, P
)
;
|
||
|
bool
operator
>=
(
P, P
)
;
|
||
|
bool
operator
==
(
P, P
)
;
|
||
|
bool
operator
!
=
(
P, P
)
;
|
||
Pour chaque type
MP
qui est un pointeur vers un membre objet ou un pointeur vers une fonction membre
ou
std::nullptr_t
(depuis C++11)
, les signatures de fonction suivantes participent à la résolution de surcharge :
|
bool
operator
==
(
MP, MP
)
;
|
||
|
bool
operator
!
=
(
MP, MP
)
;
|
||
#include <iostream> struct Foo { int n1; int n2; }; union Union { int n; double d; }; int main() { std::cout << std::boolalpha; char a[4] = "abc"; char* p1 = &a[1]; char* p2 = &a[2]; std::cout << "Pointers to array elements:\n" << "p1 == p2? " << (p1 == p2) << '\n' << "p1 < p2? " << (p1 < p2) << '\n'; Foo f; int* p3 = &f.n1; int* p4 = &f.n2; std::cout << "Pointers to members of a class:\n" << "p3 == p4? " << (p3 == p4) << '\n' << "p3 < p4? " << (p3 < p4) << '\n'; Union u; int* p5 = &u.n; double* p6 = &u.d; std::cout << "Pointers to members of a union:\n" << "p5 == (void*)p6? " << (p5 == (void*)p6) << '\n' << "p5 < (void*)p6? " << (p5 < (void*)p6) << '\n'; }
Sortie :
Pointers to array elements: p1 == p2? false p1 < p2? true Pointers to members of a class: p3 == p4? false p3 < p4? true Pointers to members of a union: p5 == (void*)p6? true p5 < (void*)p6? false
Comparaison à trois voiesL'opérateur de comparaison à trois voies a pour expression la forme
L'expression retourne un objet tel que
Si l'un des opérandes est de type bool et l'autre ne l'est pas, le programme est incorrect. Si les deux opérandes ont des types arithmétiques, ou si un opérande a un type d'énumération non délimitée et l'autre a un type intégral, les conversions arithmétiques usuelles sont appliquées aux opérandes, et ensuite
Si les deux opérandes ont le même type d'énumération
Si au moins un des opérandes est un pointeur vers objet ou pointeur vers membre, les conversions tableau-vers-pointeur , les conversions de pointeur et les conversions de qualification sont appliquées aux deux opérandes pour les amener à leur type de pointeur composite . Pour les opérandes pointeurs convertis p et q , p <=> q retourne une prvalue de type std::strong_ordering :
Sinon, le programme est mal formé.
Surcharges
Dans
la résolution de surcharge pour les opérateurs définis par l'utilisateur
, pour un type pointeur ou énumération
Où
Exécuter ce code
#include <compare> #include <iostream> int main() { double foo = -0.0; double bar = 0.0; auto res = foo <=> bar; if (res < 0) std::cout << "-0 is less than 0"; else if (res > 0) std::cout << "-0 is greater than 0"; else if (res == 0) std::cout << "-0 and 0 are equal"; else std::cout << "-0 and 0 are unordered"; } Sortie : -0 and 0 are equal |
(depuis C++20) | |||||||||||||||||||||||||||||
Notes
Étant donné que les opérateurs de comparaison se regroupent de gauche à droite, l'expression a < b < c est analysée comme ( a < b ) < c , et non comme a < ( b < c ) ou ( a < b ) && ( b < c ) .
#include <iostream> int main() { int a = 3, b = 2, c = 1; std::cout << std::boolalpha << (a < b < c) << '\n' // true; peut-être un avertissement << ((a < b) < c) << '\n' // true << (a < (b < c)) << '\n' // false << ((a < b) && (b < c)) << '\n'; // false }
Une exigence courante pour l'opérateur< défini par l'utilisateur est l'ordre faible strict . En particulier, cela est requis par les algorithmes standards et les conteneurs qui fonctionnent avec les types Compare : std::sort , std::max_element , std::map , etc.
Le résultat de comparaison des pointeurs vers différents membres de données non statiques de la même classe implique que les membres de données non statiques dans chacun des trois modes d'accès membre (jusqu'à C++23) sont positionnés en mémoire dans l'ordre de déclaration.
Bien que le résultat de la comparaison de pointeurs d'origine aléatoire (par exemple, ne pointant pas tous vers des membres du même tableau) soit non spécifié, de nombreuses implémentations fournissent un ordre total strict des pointeurs, par exemple s'ils sont implémentés comme des adresses dans un espace d'adressage virtuel continu. Les implémentations qui ne le font pas (par exemple, lorsque tous les bits du pointeur ne font pas partie d'une adresse mémoire et doivent être ignorés pour la comparaison, ou qu'un calcul supplémentaire est nécessaire, ou autrement lorsque la relation entre pointeur et entier n'est pas biunivoque), fournissent une spécialisation de std::less pour les pointeurs qui offre cette garantie. Cela permet d'utiliser tous les pointeurs d'origine aléatoire comme clés dans les conteneurs associatifs standards tels que std::set ou std::map .
Pour les types qui sont à la fois EqualityComparable et LessThanComparable , la bibliothèque standard C++ établit une distinction entre l'égalité , qui est la valeur de l'expression a == b et l'équivalence , qui est la valeur de l'expression ! ( a < b ) && ! ( b < a ) .
La comparaison entre les pointeurs et les constantes de pointeur nul a été supprimée par la résolution de CWG issue 583 incluse dans N3624 :
void f(char* p) { if (p > 0) { /*...*/ } // Erreur avec N3624, compilait avant N3624 if (p > nullptr) { /*...*/ } // Erreur avec N3624, compilait avant N3624 } int main() {}
La comparaison à trois voies peut être générée automatiquement pour les types de classe, voir les comparaisons par défaut .
Si les deux opérandes sont des tableaux, la comparaison à trois voies est mal formée.
unsigned int i = 1; auto r = -1 < i; // piège existant : retourne 'false' auto r2 = -1 <=> i; // Erreur : conversion restrictive requise
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_impl_three_way_comparison
|
201907L
|
(C++20) | Comparaison à trois voies (support du compilateur) |
__cpp_lib_three_way_comparison
|
201907L
|
(C++20) | Comparaison à trois voies (support de la bibliothèque) ; ajout de la comparaison à trois voies à la bibliothèque |
Bibliothèque standard
Les opérateurs de comparaison sont surchargés pour de nombreuses classes dans la bibliothèque standard.
|
(supprimé en C++20)
|
vérifie si les objets font référence au même type
(fonction membre publique de
std::type_info
)
|
|
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare deux
error_code
s
(fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare les
error_condition
s et les
error_code
s
(fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs dans la
pair
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs dans le tuple
(modèle de fonction) |
|
(supprimé en C++20)
|
compare le contenu
(fonction membre publique de
std::bitset<N>
)
|
|
(supprimé en C++20)
|
compare deux instances d'allocateur
(fonction membre publique de
std::allocator<T>
)
|
|
(supprimé en C++20)
(C++20)
|
compare avec un autre
unique_ptr
ou avec
nullptr
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare avec un autre
shared_ptr
ou avec
nullptr
(modèle de fonction) |
|
(supprimé en C++20)
|
compare un
std::function
avec
nullptr
(modèle de fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
compare deux durées
(modèle de fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
compare deux points temporels
(modèle de fonction) |
|
(supprimé en C++20)
|
compare deux objets
scoped_allocator_adaptor
(fonction template) |
|
(supprimé en C++20)
(C++20)
|
compare les objets
std::type_index
sous-jacents
(fonction membre publique de
std::type_index
)
|
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement deux chaînes
(modèle de fonction) |
|
(supprimé en C++20)
|
comparaison d'égalité entre objets locale
(fonction membre publique de
std::locale
)
|
|
(C++11)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
array
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
deque
s
(modèle de fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++11)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
forward_list
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
list
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
vector
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
map
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
multimap
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
set
s
(modèle de fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement les valeurs de deux
multiset
s
(modèle de fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
|
compare les valeurs dans l'unordered_map
(modèle de fonction) |
|
(C++11)
(C++11)
(removed in C++20)
|
compare les valeurs dans le unordered_multimap
(modèle de fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
|
compare les valeurs dans l'unordered_set
(modèle de fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
|
compare les valeurs dans l'unordered_multiset
(modèle de fonction) |
compare lexicographiquement les valeurs de deux
queue
s
(modèle de fonction) |
|
compare lexicographiquement les valeurs de deux
stack
s
(modèle de fonction) |
|
|
compare les itérateurs sous-jacents
(modèle de fonction) |
|
|
(C++11)
(C++11)
(supprimé en C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
compare les itérateurs sous-jacents
(modèle de fonction) |
|
(supprimé en C++20)
|
compare deux
istream_iterator
s
(modèle de fonction) |
|
(supprimé en C++20)
|
compare deux
istreambuf_iterator
s
(modèle de fonction) |
|
(supprimé en C++20)
|
compare deux nombres complexes ou un complexe et un scalaire
(modèle de fonction) |
|
compare deux valarrays ou un valarray avec une valeur
(modèle de fonction) |
|
|
(C++11)
(C++11)
(supprimé en C++20)
|
compare les états internes de deux moteurs de nombres pseudo-aléatoires
(fonction) |
|
(C++11)
(C++11)
(supprimé en C++20)
|
compare deux objets de distribution
(fonction) |
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare un
sub_match
avec un autre
sub_match
, une chaîne ou un caractère
(modèle de fonction) |
|
(supprimé en C++20)
|
compare lexicographiquement les valeurs dans les deux résultats de correspondance
(modèle de fonction) |
|
(supprimé en C++20)
|
compare deux
regex_iterator
s
(fonction membre publique de
std::regex_iterator<BidirIt,CharT,Traits>
)
|
|
(supprimé en C++20)
|
compare deux
regex_token_iterator
s
(fonction membre publique de
std::regex_token_iterator<BidirIt,CharT,Traits>
)
|
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare deux
thread::id
objets
(fonction) |
L'espace de noms std::rel_ops fournit les opérateurs génériques ! = , > , <= , et >= :
|
Défini dans l'en-tête
<utility>
|
|
|
Défini dans l'espace de noms
std::rel_ops
|
|
|
(obsolète en C++20)
|
génère automatiquement les opérateurs de comparaison basés sur
operator
==
et
operator
<
définis par l'utilisateur
(modèle de fonction) |
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
|
CWG 583
( N3624 ) |
C++98 |
les six opérateurs de comparaison pouvaient être utilisés pour
comparer un pointeur avec une constante de pointeur nul |
seuls les opérateurs d'égalité
sont autorisés |
| CWG 661 | C++98 |
la sémantique réelle des comparaisons arithmétiques (par ex.
si 1 < 2 donne true ou false ) n'était pas spécifiée |
spécification ajoutée |
| CWG 879 | C++98 |
les pointeurs vers des types fonction et les pointeurs
vers void n'avaient pas de comparaisons intégrées |
ajout de la spécification de comparaison
pour ces pointeurs |
| CWG 1596 | C++98 |
les objets non-tableaux étaient considérés comme appartenant à des tableaux avec
un seul élément uniquement pour l'arithmétique des pointeurs |
la règle est également
appliquée à la comparaison |
| CWG 1598 | C++98 |
deux pointeurs vers des membres de classes différentes et
dont aucune n'est la classe de base de l'autre ne se comparaient pas égaux même si les décalages des membres pointés pouvaient être identiques |
le résultat est
non spécifié dans ce cas |
| CWG 1858 | C++98 |
il n'était pas clair si deux pointeurs vers des membres
qui font référence à différents membres de la même union se comparent égaux comme s'ils référençaient le même membre |
ils se comparent
égaux dans ce cas |
| CWG 2419 | C++98 |
un pointeur vers un objet non-tableau n'était traité comme un
pointeur vers le premier élément d'un tableau de taille 1 dans la comparaison de pointeurs que si le pointeur est obtenu par
&
|
s'applique à tous les pointeurs
vers des objets non-tableaux |
| CWG 2526 | C++98 |
la définition de la comparaison relationnelle (
>
,
>=
,
<
et
<=
) des
pointeurs vers void et des pointeurs de fonction avait été supprimée par N3624 |
restaurée |
| CWG 2796 | C++17 |
les conversions de pointeurs de fonction n'étaient pas effectuées sur les
opérandes pointeurs convertis lors des comparaisons relationnelles intégrées de pointeurs |
effectue ces
conversions dans ce cas |
Voir aussi
- Priorité des opérateurs
- Surcharge des opérateurs
- Compare (exigences nommées)
| Opérateurs courants | ||||||
|---|---|---|---|---|---|---|
| affectation |
incrémentation
décrémentation |
arithmétique | logique | comparaison |
accès
membre |
autres |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
appel de fonction
a ( ... ) |
|
virgule
a, b |
||||||
|
conditionnel
a ? b : c |
||||||
| Opérateurs spéciaux | ||||||
|
static_cast
convertit un type en un autre type apparenté
|
||||||
|
Documentation C
pour
Opérateurs de comparaison
|