In C ++ 20 wurde die Funktionsweise der Vergleichsoperatoren geändert, insbesondere mit der Einführung des Raumschiffoperators <=>
. Insbesondere, wenn Sie nur angeben operator==
, wird dann a != b
umgeschrieben !(a == b)
.
Aus [over.match.oper] /3.4 :
Der umgeschriebene Kandidatensatz wird wie folgt bestimmt:
- Für die Vergleichsoperatoren ([expr.rel]) enthalten die umgeschriebenen Kandidaten alle nicht umgeschriebenen Kandidaten für den Ausdruck x <=> y.
- Für die relationalen ([expr.rel]) und Drei-Wege-Vergleichsoperatoren ([expr.spaceship]) enthalten die umgeschriebenen Kandidaten auch einen synthetisierten Kandidaten, wobei die Reihenfolge der beiden Parameter umgekehrt ist, für jeden nicht umgeschriebenen Kandidaten für die Ausdruck y <=> x.
- Für den Operator! = ([Expr.eq]) enthalten die umgeschriebenen Kandidaten alle nicht umgeschriebenen Kandidaten für den Ausdruck x == y.
- Für die Gleichheitsoperatoren enthalten die umgeschriebenen Kandidaten auch einen synthetisierten Kandidaten mit umgekehrter Reihenfolge der beiden Parameter für jeden nicht umgeschriebenen Kandidaten für den Ausdruck y == x.
- Für alle anderen Operatoren ist der neu geschriebene Kandidatensatz leer.
Und [over.match.oper] / 9 :
Wenn ein umgeschriebener Operator == Kandidat durch Überladungsauflösung für einen Operator @ ausgewählt wird, lautet sein Rückgabetyp cv bool, und x @ y wird wie folgt interpretiert:
- wenn @ ist! = und der ausgewählte Kandidat ein synthetisierter Kandidat mit umgekehrter Reihenfolge der Parameter ist ,! (y == x),
- andernfalls, wenn @ ist! = ,! (x == y) ,
- andernfalls (wenn @ == ist), y == x,
jeweils mit dem ausgewählten umgeschriebenen Operator == Kandidat.
Eine explizite Überlastung für operator!=
ist somit nicht mehr erforderlich. Das Entfernen des Operators hat die Vergleichssemantik nicht geändert.
operator!=
Soweit ich das beurteilen kann, wurden alle Container entfernt (siehe z. B. die Vektorsynopse ). Die einzigen Ausnahmen sind die Containeradapter std::queue
und std::stack
: Ich vermute, dass die Abwärtskompatibilität bei Verwendung mit Containern von Drittanbietern erhalten bleiben soll, falls die Gleichheitsoperatoren nicht symmetrisch sind.
Wir brauchen keine Bibliothek
operator!=
mehr. Die Bereitstellungoperator==
ermöglicht dem Compiler einige Jonglieren und bewerten zu tuna != b
in Bezug aufa == b
, alle auf ihre eigene.std::type_info
und viele weitere Bibliothekstypenoperator!=
wurden im Rahmen von P1614 - Das Mutterschiff ist gelandet entfernt .quelle