Operadores de comparación
![]() |
Esta página se ha traducido por ordenador/computador/computadora de la versión en inglés de la Wiki usando Google Translate.
La traducción puede contener errores y palabras aparatosas/incorrectas. Planea sobre el texto para ver la versión original. Puedes ayudar a corregir los errores y mejorar la traducción. Para instrucciones haz clic aquí. |
Compara los argumentos.
Nombre operador | Sintaxis | Sobrecargable | Ejemplos de prototipo (para class T) | |
---|---|---|---|---|
Como función miembro | Como función libre (espacio de nombres) | |||
igual a | a == b
|
Sí | bool T::operator ==(const T2 &b) const; | bool operator ==(const T &a, const T2 &b); |
no igual a | a != b
|
Sí | bool T::operator !=(const T2 &b) const; | bool operator !=(const T &a, const T2 &b); |
menor que | a < b
|
Sí | bool T::operator <(const T2 &b) const; | bool operator <(const T &a, const T2 &b); |
mayor que | a > b
|
Sí | bool T::operator >(const T2 &b) const; | bool operator >(const T &a, const T2 &b); |
menor o igual que | a <= b
|
Sí | bool T::operator <=(const T2 &b) const; | bool operator <=(const T &a, const T2 &b); |
mayor o igual a | a >= b
|
Sí | bool T::operator >=(const T2 &b) const; | bool operator >=(const T &a, const T2 &b); |
comparación de tres vías (C++20) | a <=> b
|
Sí | /*ver descripción*/ T::operator <=>(const T2 &b) const; | /*ver descripción*/ operator <=>(const T &a, const T2 &b); |
|
Contenido |
[editar] Comparación de dos vías
Las expresiones del operador de comparación de dos vías tienen la forma
lhs < rhs
|
(1) | ||||||||
lhs > rhs
|
(2) | ||||||||
lhs <= rhs
|
(3) | ||||||||
lhs >= rhs
|
(4) | ||||||||
lhs == rhs
|
(5) | ||||||||
lhs != rhs
|
(6) | ||||||||
verdadero
si lhs es menor que rhs, falso
en otro caso.verdadero
si lhs es mayor que rhs, falso
en otro caso.verdadero
si lhs es menor o igual a rhs, falso
en otro caso.verdadero
si lhs es mayor o igual a rhs, falso
en otro caso.verdadero
si lhs es igual a rhs, falso
en otro caso.verdadero
si lhs no es igual a rhs, falso
en otro caso.En todos los casos, para los operadores integrados, lhs y rhs deben tener cualquier
- tipo aritmético o enumerado (vea operadores de comparación aritmética más abajo)
- tipo puntero (vea operadores de comparación de punteros más abajo)
después de la aplicación de las conversiones estándar lvalue a rvalue, matriz a puntero and función a puntero. La comparación está en desuso si ambos operandos tienen tipo matriz antes de la aplicación de estas conversiones. (desde C++20)
En cualquier caso, el resultado es un bool
prvalue.
[editar] Los operadores aritméticos de comparación
Si los operandos tienen tipo aritmético o enumerado (sin y con ámbito), las conversiones aritméticas usuales se realizan en ambos operandos siguiendo las reglas de los operadores aritméticos. Los valores se comparan después de las conversiones:
[editar] Ejemplo
#include <iostream> int main() { std::cout << std::boolalpha; int n = -1; int n2 = 1; std::cout << " -1 == 1? " << (n == n2) << '\n' << "Comparando dos valores con signo:\n" << " -1 < 1? " << (n < n2) << '\n' << " -1 > 1? " << (n > n2) << '\n'; unsigned int u = 1; std::cout << "Comparando con y sin signo:\n" << " -1 < 1? " << (n < u) << '\n' << " -1 > 1? " << (n > u) << '\n'; unsigned char uc = 1; std::cout << "Comparando con signo y tipo menor sin signo:\n" << " -1 < 1? " << (n < uc) << '\n' << " -1 > 1? " << (n > uc) << '\n'; }
Salida:
-1 == 1? false Comparando dos valores con signo: -1 < 1? true -1 > 1? false Comparando con y sin signo: -1 < 1? false -1 > 1? true Comparando con signo y tipo menor sin signo: -1 < 1? true -1 > 1? false
[editar] Operadores de comparación de puntero
Los operadores de comparación se pueden usar para comparar dos punteros (o punteros a miembro, para operator== y operator!= solamente), o un puntero a miembro (desde C++14) y una constante puntero nulo, o dos constantes puntero nulo (pero solamente mientras uno de ellos sea std::nullptr_t: la comparación de NULL y NULL sigue las reglas aritméticas de comparación) (hasta C++14).
Primero, conversiones de puntero (conversiones de puntero a miembro si los argumentos son punteros a miembro), conversiones de puntero a función, (desde C++17) y conversiones de calificación se aplican a ambos operandos para obtener el tipo compuesto de puntero, como sigue:
T
para cualquier tipo T
, donde T
es un tipo objeto o void, el tipo compuesto es "puntero a cv12 void", donde cv12 es la unión de cv1 y cv2
4) Si ambos operandos son punteros al mismo tipo, con diferente calificación constante/volátil, el compuesto es un puntero al mismo tipo con calificación constante/volátil que es la unión de las calificaciones de los argumentos.
|
(hasta C++14) |
4) Si los tipos de los operandos son P1, un puntero a (posiblemente calificado constante/volátil) T1, y P2, un puntero a (posiblemente calificado constante/volátil) T2, y si T1 es el mismo que T2 o es clase base de T2, entonces el tipo de puntero compuesto es el tipo combinación constante/volátil de P1 y P2. En otro caso, si T2 es una clase base de T1, entonces el tipo de puntero compuesto es el tipo combinación constante/volátil) de P2 y P1.
5) Si los tipos de los operandos son MP1, puntero a miembro de T1 de tipo (posiblemente calificado constante/volátil) U1 y MP2, puntero a miembro de T2 de tipo (posiblemente calificado constante/volátil) U2, y si T1 es el mismo o derivado de T2, entonces el tipo del puntero compuesto es el tipo combinación constante/volátil de MP1 y MP2. En otro caso, si T2 es derivado de T1, entonces el tipo de puntero compuesto es de tipo combinado constante/volátil de MP2 y MP1.
6) Si los tipos de los operandos P1 y P2 son tipos puntero mixto multinivel y puntero a miembro con el mismo número de niveles que solo difieren en las calificaciones constante/volátil en alguno de los niveles, el tipo de puntero compuesto es la combinación constante/volátil de P1 y P2.
En la definición anterior, tipo combinado constante/volátil de dos tipos puntero P1 y P2 es un tipo P3 que tiene el mismo número de niveles y tipo en cada nivel que P1, excepto que las calificaciones constante/volátil de cada nivel se establecen como sigue: a) en cada nivel distinto del nivel superior, la unión de las calificaciones constante/volátil de ese nivel de P1 y P2
b) si el resultado de la calificación constante/volátil en cualquier nivel es diferente de las calificaciones constante/volátil de P1 y P2 en el mismo nivel, entonces se añade const a todos los niveles entre el nivel superior y este.
Por ejemplo, el tipo puntero compuesto de void* y const int* es const void*. El tipo de puntero compuesto de int** y const int** es const int* const*. Tenga en cuenta que hasta C++14, int** y const int** no se podían comparar. |
(desde C++14) |
Añadido a lo anterior, el tipo de puntero compuesto entre un puntero a función y un puntero a función noexcept (siempre que el tipo de unión sea el mismo) es un puntero a función. |
(desde C++17) |
Tenga en cuenta que esto implica que cualquier puntero se puede comparar con void*.
El resultado de comparar dos punteros a objetos (después de las conversiones) se define como:
&obj+1
es mayor que &obj
. (desde C++17)El resultado de la comparación de igualdad de dos punteros (después de las conversiones) se define como:
El resultado de la comparación de dos punteros a miembros (después de las conversiones) se define como:
Si un puntero p
se compara igual al puntero q
, p<=q
y p>=q
dan verdadero
, y p<q
y p>q
dan falso
.
Si un puntero p
se compara mayor que un puntero q
, entonces p>=q
, p>q
, q<=p
, y q<p
danverdadero
, y p<=q
, p<q
, q>=p
, y q>p
dan falso
.
Si dos punteros no se especifican para comparar mayor o igual, el resultado de la comparación es inespecífica. El resultado puede ser no determinista, y no necesita ser consistentemente igual para múltiples evaluaciones de la misma expresión con los mismos operandos en la misma ejecución del programa:
int x, y; bool f(int* p, int* q) { return p < q; } assert(f(&x, &y) == f(&x, &y)); // puede fallar en una implementación conforme
En la resolución de sobrecarga de operadores definidos por usuario, para cada par de tios aritméticos promocionados L
y R
, incluyendo tipos enumerados, los siguientes modelos 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 es puntero a objeto o puntero a función o std::nullptr_t (hasta C++14), los siguientes modelos 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 es puntero a objeto miembro o puntero a función miembro o std::nullptr_t, los siguientes modelos de función participan en la resolución de sobrecarga:
bool operator==(MP, MP); |
||
bool operator!=(MP, MP); |
||
[editar] Notas
Debido a que estos operadores se agrupan de izquierda a derecha, la expresión a<b<c se evalúa (a<b)<c, y no a<(b<c), ni (a<b)&&(b<c).
Un requisito común para el operador < definido por el usuario es orden estricto débil. En particular, se requiere por los algoritmos estándar y contenedores que trabajan con tipos Comparar: std::sort, std::max_element, std::map, etc.
Aunque los resultados de comparar punteros de origen aleatorio (por ejemplo, no todos apuntan a miembros de la misma matriz) es inespecífica, bastantes implementaciones proveen orden estricto total de punteros, por ejemplo, si estan implementados como direcciones en espacio virtual de direcciones continuo. Aquellas implementaciones que no (por ejemplo donde no todos los bits del puntero son parte de una dirección de memoria y tienen que ser ignorados para la comparación, o un cáluclo adicional se requiere o de otra manera el puntero y el entero no es una relación 1 a 1), provee una especialización de std::less para los punteros que tienen esta garantía. Esto hace posible usar todos los punteros de origen aleatorio como claves en contenedores asociativos estándar como std::set o std::map.
Para los tipos que son Comparable Igualdad y Comparable Menor Que, la biblioteca estándar de C++ hace 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 puntero nulo se eliminó en C++14
void f(char * p) { if (p > 0) { ... } // OK en C++98..C++11, no compila en C++14 if (p > nullptr) { ... } // OK en C++11, no compila en C++14 }
Comparación de tres víasEl operador de comparación de tres vías tiene la forma
La expresión devuelve un objeto tal que
Si uno de los operandos es de tipo bool y el otro no, el programa está mal formado. Si ambos operandos tienen tipos aritméticos, o si un operando tiene tipo enumerado sin ámbito y el otro entero, se aplican a los operandos las conversiones aritméticas usuales, y luego
Si ambos operandos tienen el mismo tipo enumerado E, el operador produce el resultado de convertir los operandos a tipo subyacente de E y aplicar <=> a los operandos convertidos. Si al menos uno de los operandos es un puntero o puntero a miembro se aplica conversiones matriz a puntero, conversiones puntero derivado a base, conversiones puntero a función, y conversiones de calificación como sea necesario parea convertir ambos operandos al mismo tipo de puntero. Si el tipo puntero resultante es un puntero a función, un puntero a miembro, o std::nullptr_t, p <=> q devuelve un prvalue de tipo std::strong_equality:
Si el tipo de puntero resultante es un tipo puntero a objeto, p <=> q devulve un prvalue de tipo strong_ordering:
En la resolución de sobrecarga de operadores definidos por usuario, para tipos puntero o enumerado
Donde R es el tipo categoría de orden definido anteriormente. Para cada T que es un tipo puntero a miembro o de tipo std::nullptr_t, los siguientes modelos de función participan en la resolución de sobrecarga:
NotasLa comparación de tres vías se puede generar automáticamente para tipos clase, ver default comparisons Si ambos operandos son matrices, la comparación de tres vías es mal formada excepto cuando se comparan miembros de clase de tipo matriz. unsigned int i = 1; auto r = -1 < i; // escollo existente: devuelve ‘false’ auto r2 = -1 <=> i; // Error: se requiere un conversión reducida
|
(desde C++20) |
Esta sección está incompleta Razón: equivalence vs. equality |
[editar] Biblioteca estándar
Los operadores de comparación están sobrecargados para muchas clases en la biblioteca estándar.
comprueba si los objetos se refieren al mismo tipo (función miembro pública de std::type_info )
| |
Compara dos códigos de error (error_code ). (función) | |
(eliminado en C++20)(eliminado en C++20)(C++20) |
Compara condiciones de error (error_condition ) y códigos de error (error_code ). (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 del par. (plantilla de función) |
Compara lexicográficamente los valores de la tupla (plantilla de función) | |
compara el contenido (función miembro pública de std::bitset )
| |
Compara dos instancias de asignador. (función miembro pública de std::allocator )
| |
(eliminado en C++20)(C++20) |
Se compara con otro
|
(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(C++20) |
Se compara con otro
|
(eliminado en C++20) |
Compara una instancia de 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) |
Compara dos puntos de tiempo. (plantilla de función) | |
Compara dos instancias de scoped_allocator_adaptor. (función miembro pública de std::scoped_allocator_adaptor )
| |
Compara los objetos std::type_info subyacentes. (función miembro pública de std::type_index )
| |
Comparación lexicográfica de dos cadenas de texto (plantilla de función) | |
(eliminado en C++20) |
Comparación de igualdad entre objetos de configuración regional. (función miembro pública de std::locale )
|
(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 array. (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 deque. (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 forward_list. (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 list. (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 vector. (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 map. (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 multimap. (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 set. (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 multiset. (plantilla de función) |
Compara los valores de unordered_map. (plantilla de función) | |
Compara los valores de unordered_multimap. (plantilla de función) | |
Compara los valores de unordered_set. (plantilla de función) | |
Compara los valores de unordered_multiset. (plantilla de función) | |
Compara lexicográficamente los valores de queue. (plantilla de función) | |
Compara lexicográficamente los valores de stack. (plantilla de función) | |
compara los iteradores subyacentes (plantilla de función) | |
compara los iteradores subyacentes (plantilla de función) | |
compara dos istream_iterator (plantilla de función) | |
compara dos istreambuf_iterator (plantilla de función) | |
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) | |
compara los estados internos de dos motores de números pseudo-aleatorios (función) | |
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 objeto sub_match con otro objeto 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 coincidencias. (plantilla de función) |
(eliminado en C++20) |
Compara dos objetos regex_iterator . (función miembro pública de std::regex_iterator )
|
(eliminado en C++20) |
Compara dos objetos regex_token_iterator . (función miembro pública de std::regex_token_iterator )
|
(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 rel_ops proporciona los operadores genéricos !=, >, <=, y >=
Definido en el archivo de encabezado
<utility> | |
Definido en el espacio de nombres
std::rel_ops | |
(en desuso en C++20) |
Genera automáticamente operadores de comparación basados en operator== y operator< definidos por el usuario (plantilla de función) |
[editar] Ver también
Operadores comunes | ||||||
---|---|---|---|---|---|---|
Asignación | Incremento/decremento | Aritméticos | Lógicos | Comparación | Acceso a miembro | Otros |
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
Operadores especiales | ||||||
static_cast Convierte de un tipo a otro tipo relacionado |
Documentación de C para Operadores de comparación
|