Namespaces
Variants

Comparison operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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]
Notes
  • Lorsque les opérateurs intégrés renvoient bool , la plupart des surcharges définies par l'utilisateur renvoient également bool afin que les opérateurs définis par l'utilisateur puissent être utilisés de la même manière que les opérateurs intégrés. Cependant, dans une surcharge d'opérateur définie par l'utilisateur, n'importe quel type peut être utilisé comme type de retour (y compris void ).
  • U peut être n'importe quel type, y compris T .
  1. 1.0 1.1 R est le type de retour de operator<=> ( voir ci-dessous )

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)
**Note:** Le contenu de cette page web ne contient que des termes techniques C++ (`lhs`, `rhs`, `==`, `!=`) et des numéros de version qui ne nécessitent pas de traduction. La structure HTML et les balises ont été préservées conformément aux instructions.
1) Retourne true si lhs est inférieur à rhs , false sinon.
2) Retourne true si lhs est supérieur à rhs , false sinon.
3) Retourne true si lhs est inférieur ou égal à rhs , false sinon.
4) Retourne true si lhs est supérieur ou égal à rhs , false sinon.
5) Retourne true si lhs est égal à rhs , false sinon.
6) Retourne true si lhs n'est pas égal à rhs , false sinon.

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 :

  • 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 C1 et l'autre à un membre d'une classe différente C2 , 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 :

(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 voies

L'opérateur de comparaison à trois voies a pour expression la forme

a <=> b

L'expression retourne un objet tel que

  • ( a <=> b ) < 0 si a < b ,
  • ( a <=> b ) > 0 si a > b ,
  • ( a <=> b ) == 0 si a et b sont égaux/équivalents.

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 une conversion rétrécissante est requise, autre que d'un type intégral vers un type à virgule flottante, le programme est mal formé.
  • Sinon, si les opérandes ont un type intégral, l'opérateur produit une prvalue de type std::strong_ordering :
  • std::strong_ordering::equal si les deux opérandes sont arithmétiquement égaux,
  • std::strong_ordering::less si le premier opérande est arithmétiquement inférieur au second,
  • std::strong_ordering::greater sinon.
  • Sinon, les opérandes ont un type à virgule flottante, et l'opérateur produit une prvalue de type std::partial_ordering . L'expression a <=> b produit
  • std::partial_ordering::less si a est inférieur à b ,
  • std::partial_ordering::greater si a est supérieur à b ,
  • std::partial_ordering::equivalent si a est équivalent à b ( - 0 <=> + 0 est équivalent),
  • std::partial_ordering::unordered ( NaN <=> anything est non ordonné).

Si les deux opérandes ont le même type d'énumération E , l'opérateur produit le résultat de la conversion des opérandes vers le type sous-jacent de E et applique <=> aux opérandes converties.

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 :

  • std::strong_ordering::equal s'ils se comparent égaux ,
  • std::strong_ordering::less si q se compare supérieur à p ,
  • std::strong_ordering::greater si p se compare supérieur à q ,
  • résultat non spécifié si le résultat de la comparaison bidirectionnelle est non spécifié.

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 T , la signature de fonction suivante participe à la résolution de surcharge :

R operator <=> ( T, T ) ;

R est le type de catégorie de classement défini ci-dessus.

#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> )
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)
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
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

Opérateurs courants
affectation incrémentation
décrémentation
arithmétique logique comparaison accès
membre
autres

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

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é
dynamic_cast convertit au sein des hiérarchies d'héritage
const_cast ajoute ou supprime les cv -qualificateurs
reinterpret_cast convertit un type en un type non apparenté
C-style cast convertit un type en un autre par un mélange de static_cast , const_cast , et reinterpret_cast
new crée des objets avec une durée de stockage dynamique
delete détruit les objets précédemment créés par l'expression new et libère la zone mémoire obtenue
sizeof interroge la taille d'un type
sizeof... interroge la taille d'un pack (depuis C++11)
typeid interroge les informations de type d'un type
noexcept vérifie si une expression peut lever une exception (depuis C++11)
alignof interroge les exigences d'alignement d'un type (depuis C++11)

Documentation C pour Opérateurs de comparaison