En C ++ 20, le fonctionnement des opérateurs relationnels a été modifié, notamment avec l'introduction de l' <=>
opérateur de vaisseau spatial . En particulier, si vous fournissez seulement operator==
, alors a != b
est réécrit !(a == b)
.
Depuis [over.match.oper] /3.4 :
L'ensemble de candidats réécrit est déterminé comme suit:
- Pour les opérateurs relationnels ([expr.rel]), les candidats réécrits incluent tous les candidats non réécrits pour l'expression x <=> y.
- Pour les opérateurs relationnels ([expr.rel]) et de comparaison à trois ([expr.spaceship]), les candidats réécrits incluent également un candidat synthétisé, avec l'ordre des deux paramètres inversé, pour chaque candidat non réécrit pour le expression y <=> x.
- Pour l'opérateur! = ([Expr.eq]), les candidats réécrits incluent tous les candidats non réécrits pour l'expression x == y.
- Pour les opérateurs d'égalité, les candidats réécrits incluent également un candidat synthétisé, avec l'ordre des deux paramètres inversé, pour chaque candidat non réécrit pour l'expression y == x.
- Pour tous les autres opérateurs, l'ensemble de candidats réécrit est vide.
Et [over.match.oper] / 9 :
Si un candidat opérateur réécrit == est sélectionné par résolution de surcharge pour un opérateur @, son type de retour doit être cv bool, et x @ y est interprété comme:
- si @ est! = et que le candidat sélectionné est un candidat synthétisé avec un ordre de paramètres inversé,! (y == x),
- sinon, si @ est! =,! (x == y) ,
- sinon (quand @ est ==), y == x,
dans chaque cas en utilisant l'opérateur réécrit sélectionné == candidat.
En tant que tel, une surcharge explicite pour operator!=
n'est plus nécessaire. La suppression de l'opérateur n'a pas modifié la sémantique de comparaison.
Pour operator!=
autant que je sache, tous les conteneurs ont été retirés (voir par exemple le synopsis des vecteurs ). Les seules exceptions sont les adaptateurs de conteneurs std::queue
et std::stack
: je suppose que c'est pour préserver la compatibilité descendante lorsqu'ils sont utilisés avec des conteneurs tiers, au cas où les opérateurs d'égalité ne seraient pas symétriques.
Nous n'avons plus besoin d'une bibliothèque fournie
operator!=
. Fourniroperator==
permet au compilateur de jongler et d'évaluera != b
en termes dea == b
, tout seul.std::type_info
et de nombreux autres types de bibliothèques ont étéoperator!=
supprimés dans le cadre de P1614 - The Mothership has Landed .la source