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

Compara los argumentos.

Nombre del operador Sintaxis Sobrecarg able Ejemplos de prototipo (para class T )
Dentro de la definición de clase Fuera de la definición de clase
Igual a a == b bool T :: operator == ( const U & b ) const ; bool operator == ( const T & a, const U & b ) ;
No igual a a != b bool T :: operator ! = ( const U & b ) const ; bool operator ! = ( const T & a, const U & b ) ;
Menor que a < b bool T :: operator < ( const U & b ) const ; bool operator < ( const T & a, const U & b ) ;
Mayor que a > b bool T :: operator > ( const U & b ) const ; bool operator > ( const T & a, const U & b ) ;
Menor o igual que a <= b bool T :: operator <= ( const U & b ) const ; bool operator <= ( const T & a, const U & b ) ;
Mayor o igual que a >= b bool T :: operator >= ( const U & b ) const ; bool operator >= ( const T & a, const U & b ) ;
Comparación de tres vías (C++20) a <=> b R T :: operator <=> ( const U & b ) const ; [1] R operator <=> ( const T & a, const U & b ) ; [1]
Notas
  • Donde los operadores incorporados retornan bool , la mayoría de las sobrecargas definidas por el usuario también retornan bool para que los operadores definidos por el usuario puedan usarse de la misma manera que los incorporados. Sin embargo, en una sobrecarga de operador definida por el usuario, se puede usar cualquier tipo como tipo de retorno (incluyendo void ).
  • U puede ser cualquier tipo incluyendo T .
  1. 1.0 1.1 R es el tipo de retorno de operator<=> ( ver abajo )

Contenidos

Comparación bidireccional

Las expresiones de operadores de comparación bidireccional tienen la forma

Operadores relacionales
lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
Operadores de igualdad
lhs == rhs (5)
lhs != rhs (6)
1) Devuelve true si lhs es menor que rhs , false en caso contrario.
2) Devuelve true si lhs es mayor que rhs , false en caso contrario.
3) Devuelve true si lhs es menor o igual que rhs , false en caso contrario.
4) Devuelve true si lhs es mayor o igual que rhs , false en caso contrario.
5) Devuelve true si lhs es igual a rhs , false en caso contrario.
6) Devuelve true si lhs no es igual a rhs , false en caso contrario.

Operadores de comparación bidireccionales incorporados

Para los operadores de comparación bidireccionales integrados, conversiones de lvalue a rvalue , conversiones de array a puntero (hasta C++26) y conversiones de función a puntero se aplican a lhs y rhs .

La comparación está obsoleta si tanto lhs como rhs tienen tipo array antes de la aplicación de estas conversiones.

(since C++20)
(until C++26)

Para los operadores relacionales incorporados, si uno de los operandos es un puntero, se realiza la conversión de array a puntero en el otro operando.

Para los operadores de igualdad incorporados, si uno de los operandos es un puntero o una constante de puntero nulo , se realiza la conversión de array a puntero en el otro operando.

(since C++26)

Para los operadores de comparación bidireccionales integrados, el resultado es un bool prvalue.

Comparación aritmética incorporada

Si los operandos convertidos tienen ambos tipo aritmético o de enumeración (con ámbito o sin ámbito), usual arithmetic conversions se realizan en ambos operandos. Los valores se comparan después de las conversiones:

#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
              << "Comparando dos valores con signo:\n"
                 " -1 == 1 ? " << (a == b) << "\n"
                 " -1 <  1 ? " << (a <  b) << "\n"
                 " -1 >  1 ? " << (a >  b) << "\n"
                 "Comparando con signo y sin signo:\n"
                 // puede generar advertencia de signo diferente:
                 " -1 == 1 ? " << (a == c) << "\n"
                 // puede generar advertencia de signo diferente:
                 " -1 <  1 ? " << (a <  c) << "\n"
                 // puede generar advertencia de signo diferente:
                 " -1 >  1 ? " << (a >  c) << "\n"
                 "Comparando con signo y sin signo más pequeño:\n"
                 " -1 == 1 ? " << (a == d) << "\n"
                 " -1 <  1 ? " << (a <  d) << "\n"
                 " -1 >  1 ? " << (a >  d) << '\n';
}

Salida:

Comparando dos valores con signo:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false
Comparando con signo y sin signo:
 -1 == 1 ? false
 -1 <  1 ? false
 -1 >  1 ? true
Comparando con signo y sin signo más pequeño:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false

Comparación de igualdad de punteros incorporada

Los operandos convertidos de los operadores de igualdad == y != también pueden tener el tipo std::nullptr_t , (desde C++11) tipo puntero o tipo puntero-a-miembro.

La comparación de igualdad de punteros incorporada tiene tres resultados posibles: igual, desigual y no especificado. Los valores producidos por los operadores de igualdad para la comparación de igualdad de punteros incorporada se enumeran a continuación:

Resultado de comparación
de p y q
Valor devuelto por
p == q p ! = q
iguales true false
diferentes false true
no especificado valor bool no especificado

Si al menos uno de los lhs y rhs convertidos es un puntero, conversiones de puntero , conversiones de puntero a función (desde C++17) y conversiones de calificación se realizan en ambos operandos convertidos para llevarlos a su tipo de puntero compuesto . Los dos punteros del tipo de puntero compuesto se comparan de la siguiente manera:

  • representa la dirección más allá del final de un objeto completo diferente que no es un array, o
  • representa la dirección uno más allá del último elemento de un objeto array completo diferente,
el resultado de la comparación no está especificado.
  • De lo contrario, si los punteros son ambos nulos, ambos apuntan a la misma función, o ambos representan la misma dirección (es decir, apuntan o están más allá del final del mismo objeto), se comparan como iguales.
  • De lo contrario, los punteros se comparan como desiguales.

Si al menos uno de los lhs y rhs convertidos es un puntero a miembro, conversiones de puntero-a-miembro , conversiones de puntero a función (desde C++17) y conversiones de calificación se realizan en ambos operandos convertidos para llevarlos a su tipo de puntero compuesto . Los dos punteros a miembros del tipo de puntero compuesto se comparan de la siguiente manera:

  • Si dos punteros a miembros son ambos el valor de puntero a miembro nulo, se comparan iguales.
  • Si solo uno de dos punteros a miembros es el valor de puntero a miembro nulo, se comparan desiguales.
  • Si alguno es un puntero a una función miembro virtual , el resultado no está especificado.
  • Si uno se refiere a un miembro de la clase C1 y el otro se refiere a un miembro de una clase diferente C2 , donde ninguna es clase base de la otra, el resultado no está especificado.
  • Si ambos se refieren a (posiblemente diferentes) miembros de la misma unión , se comparan iguales.
  • En caso contrario, dos punteros a miembros se comparan iguales si referirían al mismo miembro del mismo objeto más derivado o al mismo subobjeto si se realizara una indirección con un objeto hipotético del tipo de clase asociado; de lo contrario, se comparan desiguales.
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); // no especificado
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); // falso
bool y = (pb == pl);   // verdadero

Dos operandos de tipo std::nullptr_t o un operando de tipo std::nullptr_t y el otro una constante de puntero nulo se comparan como iguales.

(since C++11)

Comparación relacional de punteros incorporada

Los operandos convertidos de los operadores relacionales > , < , >= y <= también pueden tener tipo puntero.

La comparación relacional de punteros integrados en punteros desiguales p y q tiene tres resultados posibles: p es mayor, q es mayor y no especificado. Los valores producidos por los operadores relacionales para la comparación relacional de punteros integrados se enumeran a continuación:

Resultado de comparación
de p y q
Valor devuelto por
p > q p < q p >= q p <= q
igual false false true true
p es mayor true false true false
q es mayor false true false true
no especificado valor bool no especificado

Si convertidos lhs y rhs son ambos punteros, conversiones de puntero , conversiones de puntero a función (desde C++17) y conversiones de calificación se realizan en ambos operandos convertidos para llevarlos a su tipo de puntero compuesto . Los dos punteros del tipo de puntero compuesto se comparan de la siguiente manera:

  • Si los punteros se comparan iguales o el resultado de la comparación de igualdad no está especificado, el resultado de la comparación relativa cae en la misma categoría.
  • En caso contrario (los punteros se comparan desiguales), si alguno de los punteros no es un puntero a objeto, el resultado no está especificado.
  • En caso contrario (ambos punteros apuntan a objetos), el resultado se define en términos de un orden parcial consistente con las siguientes reglas:
  • Dados dos elementos diferentes high y low de un array tal que high tiene un subíndice mayor que low , si un puntero apunta a high (o a un subobjeto de high ) y el otro puntero apunta a low (o a un subobjeto de low ), el primero se compara mayor que el segundo.
  • Si un puntero apunta a un elemento elem (o a un subobjeto de elem ) de un array, y el otro puntero está más allá del final del mismo array, el puntero pasado-el-final se compara mayor que el otro puntero.
  • Si un puntero apunta a un objeto completo, un subobjeto de clase base o un subobjeto miembro obj (o a un subobjeto de obj ), y el otro puntero está más allá del final de obj , el puntero pasado-el-final se compara mayor que el otro puntero.

  • Si los punteros apuntan a diferentes non-zero-sized (since C++20) miembros de datos no estáticos con el mismo member access (until C++23) del mismo objeto de un tipo de clase no-union, o a subobjetos de tales miembros, recursivamente, el puntero al miembro declarado posteriormente se compara mayor que el otro puntero.
  • De lo contrario, el resultado no está especificado.

Orden total de punteros

Existe un orden total estricto definido por la implementación sobre punteros en cada programa. El orden total estricto es consistente con el orden parcial descrito anteriormente: los resultados no especificados se vuelven definidos por la implementación, mientras que los demás resultados permanecen igual.

La comparación de punteros con el orden total estricto se aplica en los siguientes casos:

(desde C++14)
(desde C++20)

Sobrecargas

En la resolución de sobrecarga frente a operadores definidos por el usuario , para cada par de tipos aritméticos promovidos L y R , incluyendo tipos de enumeración, las siguientes firmas de función participan en la resolución de sobrecarga:

bool operator < ( L, R ) ;
bool operator > ( L, R ) ;
bool operator <= ( L, R ) ;
bool operator >= ( L, R ) ;
bool operator == ( L, R ) ;
bool operator ! = ( L, R ) ;

Para cada tipo P que sea puntero a objeto o puntero a función, las siguientes firmas de función participan en la resolución de sobrecarga:

bool operator < ( P, P ) ;
bool operator > ( P, P ) ;
bool operator <= ( P, P ) ;
bool operator >= ( P, P ) ;
bool operator == ( P, P ) ;
bool operator ! = ( P, P ) ;

Para cada tipo MP que sea un puntero a miembro de objeto o puntero a miembro de función o std::nullptr_t (desde C++11) , las siguientes firmas de función participan en la resolución de sobrecarga:

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';
}

Salida:

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

Comparación de tres vías

El operador de comparación de tres vías tiene la forma

a <=> b

La expresión devuelve un objeto tal que

  • ( a <=> b ) < 0 si a < b ,
  • ( a <=> b ) > 0 si a > b ,
  • ( a <=> b ) == 0 si a y b son iguales/equivalentes.

Si uno de los operandos es de tipo bool y el otro no lo es, el programa está mal formado.

Si ambos operandos tienen tipos aritméticos, o si un operando tiene tipo de enumeración no delimitado y el otro tiene tipo integral, se aplican las conversiones aritméticas usuales a los operandos, y luego

  • Si se requiere una conversión de estrechamiento, excepto de un tipo integral a un tipo de punto flotante, el programa está mal formado.
  • De lo contrario, si los operandos tienen tipo integral, el operador produce un prvalue de tipo std::strong_ordering :
  • std::strong_ordering::equal si ambos operandos son aritméticamente iguales,
  • std::strong_ordering::less si el primer operando es aritméticamente menor que el segundo,
  • std::strong_ordering::greater en caso contrario.
  • De lo contrario, los operandos tienen tipo de punto flotante, y el operador produce un prvalue de tipo std::partial_ordering . La expresión a <=> b produce
  • std::partial_ordering::less si a es menor que b ,
  • std::partial_ordering::greater si a es mayor que b ,
  • std::partial_ordering::equivalent si a es equivalente a b ( - 0 <=> + 0 es equivalente),
  • std::partial_ordering::unordered ( NaN <=> anything no está ordenado).

Si ambos operandos tienen el mismo tipo de enumeración E , el operador produce el resultado de convertir los operandos al tipo subyacente de E y aplicar <=> a los operandos convertidos.

Si al menos uno de los operandos es un puntero a objeto o puntero a miembro, conversiones de array a puntero , conversiones de puntero y conversiones de calificación se aplican a ambos operandos para llevarlos a su tipo de puntero compuesto .

Para operandos de puntero convertidos p y q , p <=> q retorna un prvalue de tipo std::strong_ordering :

  • std::strong_ordering::equal si se comparan iguales ,
  • std::strong_ordering::less si q se compara mayor que p ,
  • std::strong_ordering::greater si p se compara mayor que q ,
  • resultado no especificado si el resultado de la comparación bidireccional no está especificado.

De lo contrario, el programa está mal formado.

Sobrecargas

En la resolución de sobrecarga frente a operadores definidos por el usuario , para el tipo puntero o enumeración T , la siguiente firma de función participa en la resolución de sobrecarga:

R operator <=> ( T, T ) ;

Donde R es el tipo de categoría de ordenamiento definido anteriormente.

#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";
}

Salida:

-0 and 0 are equal
(desde C++20)

Notas

Debido a que los operadores de comparación se agrupan de izquierda a derecha, la expresión a < b < c se analiza como ( a < b ) < c , y no como a < ( b < c ) o ( a < b ) && ( b < c ) .

#include <iostream>
int main()
{
    int a = 3, b = 2, c = 1;
    std::cout << std::boolalpha
        << (a < b < c) << '\n' // verdadero; posible advertencia
        << ((a < b) < c) << '\n' // verdadero
        << (a < (b < c)) << '\n' // falso
        << ((a < b) && (b < c)) << '\n'; // falso
}

Un requisito común para user-defined operator< es strict weak ordering . En particular, esto es requerido por los algoritmos y contenedores estándar que trabajan con tipos Compare : std::sort , std::max_element , std::map , etc.

El resultado de comparación de punteros a diferentes miembros de datos no estáticos de la misma clase implica que los miembros de datos no estáticos en cada uno de los tres modos de acceso de miembros (until C++23) están posicionados en memoria en orden de declaración.

Aunque el resultado de comparar punteros de origen aleatorio (por ejemplo, no todos apuntando a miembros del mismo array) no está especificado, muchas implementaciones proporcionan un orden total estricto de punteros, por ejemplo si están implementados como direcciones dentro de un espacio de direcciones virtual continuo. Aquellas implementaciones que no lo hacen (por ejemplo, donde no todos los bits del puntero son parte de una dirección de memoria y deben ser ignorados para la comparación, o se requiere un cálculo adicional o de otra manera el puntero y el entero no tienen una relación 1 a 1), proporcionan una especialización de std::less para punteros que tiene esa garantía. Esto hace posible utilizar todos los punteros de origen aleatorio como claves en contenedores asociativos estándar como std::set o std::map .

Para los tipos que son tanto EqualityComparable como LessThanComparable , la biblioteca estándar de C++ establece una distinción entre igualdad , que es el valor de la expresión a == b y equivalencia , que es el valor de la expresión ! ( a < b ) && ! ( b < a ) .

La comparación entre punteros y constantes de puntero nulo fue eliminada por la resolución de CWG issue 583 incluida en N3624 :

void f(char* p)
{
    if (p > 0) { /*...*/ } // Error con N3624, compilaba antes de N3624
    if (p > nullptr) { /*...*/ } // Error con N3624, compilaba antes de N3624
}
int main() {}

La comparación de tres vías puede generarse automáticamente para tipos de clase, consulte comparaciones predeterminadas .

Si ambos operandos son arrays, la comparación de tres vías está mal formada.

unsigned int i = 1;
auto r = -1 < i;    // trampa existente: devuelve 'false'
auto r2 = -1 <=> i; // Error: se requiere conversión de estrechamiento
Macro de prueba de características Valor Estándar Característica
__cpp_impl_three_way_comparison 201907L (C++20) Comparación de tres vías (soporte del compilador)
__cpp_lib_three_way_comparison 201907L (C++20) Comparación de tres vías (soporte de biblioteca); adición de comparación de tres vías a la biblioteca

Biblioteca estándar

Los operadores de comparación están sobrecargados para muchas clases en la biblioteca estándar.

(eliminado en C++20)
verifica si los objetos se refieren al mismo tipo
(función miembro pública de std::type_info )
(eliminado en C++20) (eliminado en C++20) (C++20)
compara dos error_code s
(función)
(eliminado en C++20) (eliminado en C++20) (C++20)
compara error_condition s y error_code s
(función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores en el pair
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores en la tupla
(plantilla de función)
(eliminado en C++20)
compara los contenidos
(función miembro pública de std::bitset<N> )
(eliminado en C++20)
compara dos instancias de allocator
(función miembro pública de std::allocator<T> )
compara con otro unique_ptr o con nullptr
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara con otro shared_ptr o con nullptr
(plantilla de función)
(eliminado en C++20)
compara un std::function con nullptr
(plantilla de función)
(C++11) (C++11) (eliminado en C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
compara dos duraciones
(plantilla de función)
(C++11) (C++11) (eliminado en C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
compara dos puntos de tiempo
(plantilla de función)
(eliminado en C++20)
compara dos objetos scoped_allocator_adaptor
(plantilla de función)
compara los objetos subyacentes std::type_index
(función miembro pública de std::type_index )
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente dos cadenas
(plantilla de función)
(eliminado en C++20)
comparación de igualdad entre objetos locale
(función miembro pública de std::locale )
(C++11) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos array s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos deque s
(plantilla de función)
(C++11) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++11) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos forward_list s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos list s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos vector s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos map s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos multimap s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos set s
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos multiset s
(plantilla de función)
(C++11) (C++11) (removed in C++20)
compara los valores en el unordered_map
(plantilla de función)
(C++11) (C++11) (removed in C++20)
compara los valores en el unordered_multimap
(function template)
(C++11) (C++11) (removed in C++20)
compara los valores en el unordered_set
(function template)
(C++11) (C++11) (eliminado en C++20)
compara los valores en el unordered_multiset
(plantilla de función)
compara lexicográficamente los valores de dos queue s
(plantilla de función)
compara lexicográficamente los valores de dos stack s
(plantilla de función)
compara los iteradores subyacentes
(plantilla de función)
(C++11) (C++11) (eliminado en C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
compara los iteradores subyacentes
(plantilla de función)
(eliminado en C++20)
compara dos istream_iterator s
(plantilla de función)
(eliminado en C++20)
compara dos istreambuf_iterator s
(plantilla de función)
(eliminado en C++20)
compara dos números complejos o un complejo y un escalar
(plantilla de función)
compara dos valarrays o un valarray con un valor
(plantilla de función)
(C++11) (C++11) (removed in C++20)
compara los estados internos de dos motores de números pseudoaleatorios
(función)
(C++11) (C++11) (eliminado en C++20)
compara dos objetos de distribución
(función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara un sub_match con otro sub_match , una cadena, o un carácter
(plantilla de función)
(eliminado en C++20)
compara lexicográficamente los valores en los dos resultados de coincidencia
(plantilla de función)
(eliminado en C++20)
compara dos regex_iterator s
(función miembro pública de std::regex_iterator<BidirIt,CharT,Traits> )
(eliminado en C++20)
compara dos regex_token_iterator s
(función miembro pública de std::regex_token_iterator<BidirIt,CharT,Traits> )
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara dos objetos thread::id
(función)

El espacio de nombres std::rel_ops proporciona operadores genéricos ! = , > , <= , y >= :

Definido en el encabezado <utility>
Definido en el espacio de nombres std::rel_ops
genera automáticamente operadores de comparación basados en operator == y operator < definidos por el usuario
(plantilla de función)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
CWG 583
( N3624 )
C++98 los seis operadores de comparación podían usarse para
comparar un puntero con una constante de puntero nulo
solo se permiten los operadores de igualdad
en este caso
CWG 661 C++98 la semántica real de las comparaciones aritméticas (p.ej.
si 1 < 2 produce true o false ) no estaba especificada
se añadió la especificación
CWG 879 C++98 los punteros a tipos función y punteros
a void no tenían comparaciones incorporadas
se añadió la especificación de comparación
para estos punteros
CWG 1596 C++98 los objetos no array se consideraban pertenecientes a arrays con
un solo elemento solo para aritmética de punteros
la regla también se
aplica a la comparación
CWG 1598 C++98 dos punteros a miembros de clases diferentes donde
ninguna es clase base de la otra no se comparaban igual
incluso si los desplazamientos de los miembros podían ser iguales
el resultado no está
especificado
en este caso
CWG 1858 C++98 no estaba claro si dos punteros a miembros
que referencian diferentes miembros de la misma unión
se comparan igual como si referenciaran al mismo miembro
se comparan
igual en este caso
CWG 2419 C++98 un puntero a objeto no array solo se trataba como
puntero al primer elemento de un array de tamaño 1
en comparación de punteros si el puntero se obtenía mediante &
se aplica a todos los punteros
a objetos no array
CWG 2526 C++98 la definición de comparación relacional ( > , >= , < y <= ) de
punteros a void y punteros a función fue eliminada por N3624
restaurada
CWG 2796 C++17 las conversiones de puntero a función no se realizaban en los
operandos puntero convertidos durante comparaciones relacionales
de punteros incorporadas
realiza estas
conversiones en este caso

Véase también

Operadores comunes
asignación incremento
decremento
aritméticos lógicos comparación acceso a
miembros
otros

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

llamada a función

a ( ... )
coma

a, b
condicional

a ? b : c
Operadores especiales

static_cast convierte un tipo a otro tipo relacionado
dynamic_cast convierte dentro de jerarquías de herencia
const_cast añade o elimina cv -calificadores
reinterpret_cast convierte un tipo a un tipo no relacionado
Conversión estilo C convierte un tipo a otro mediante una mezcla de static_cast , const_cast , y reinterpret_cast
new crea objetos con duración de almacenamiento dinámico
delete destruye objetos previamente creados por la expresión new y libera el área de memoria obtenida
sizeof consulta el tamaño de un tipo
sizeof... consulta el tamaño de un pack (desde C++11)
typeid consulta la información de tipo de un tipo
noexcept verifica si una expresión puede lanzar una excepción (desde C++11)
alignof consulta los requisitos de alineación de un tipo (desde C++11)

Documentación de C para Operadores de comparación