En C ++ 20, la forma en que funcionan los operadores relacionales cambió, especialmente con la introducción del <=>
operador de la nave espacial . En particular, si solo proporciona operator==
, a != b
se reescribe a !(a == b)
.
De [over.match.oper] /3.4 :
El conjunto de candidatos reescrito se determina de la siguiente manera:
- Para los operadores relacionales ([expr.rel]), los candidatos reescritos incluyen todos los candidatos no reescritos para la expresión x <=> y.
- Para los operadores relacionales ([expr.rel]) y de comparación de tres vías ([expr.spaceship]), los candidatos reescritos también incluyen un candidato sintetizado, con el orden de los dos parámetros invertidos, para cada candidato no reescrito para el expresión y <=> x.
- Para el operador! = ([Expr.eq]), los candidatos reescritos incluyen todos los candidatos no reescritos para la expresión x == y.
- Para los operadores de igualdad, los candidatos reescritos también incluyen un candidato sintetizado, con el orden de los dos parámetros invertidos, para cada candidato no reescrito para la expresión y == x.
- Para todos los demás operadores, el conjunto de candidatos reescrito está vacío.
Y [over.match.oper] / 9 :
Si se selecciona un operador reescrito == candidato por resolución de sobrecarga para un operador @, su tipo de retorno será cv bool, y x @ y se interpreta como:
- if @ is! = y el candidato seleccionado es un candidato sintetizado con un orden inverso de parámetros,! (y == x),
- de lo contrario, si @ es! =,! (x == y) ,
- de lo contrario (cuando @ es ==), y == x,
en cada caso utilizando el operador reescrito seleccionado == candidato.
Como tal, operator!=
ya no es necesaria una sobrecarga explícita para . La eliminación del operador no ha cambiado la semántica de comparación.
Todos los contenedores se han operator!=
eliminado, por lo que puedo ver (ver, por ejemplo, la sinopsis del vector ). Las únicas excepciones son los adaptadores de contenedor std::queue
y std::stack
: supongo que es para preservar la compatibilidad con versiones anteriores cuando se usa con contenedores de terceros, en caso de que los operadores de igualdad no sean simétricos.
Ya no necesitamos una biblioteca provista
operator!=
. Proporcionaroperator==
permite al compilador hacer algunos malabarismos y evaluara != b
en términos dea == b
todo por sí mismo.std::type_info
y muchos más tipos de bibliotecas seoperator!=
eliminaron como parte de P1614: The Mothership ha aterrizado .fuente