Warum wird operator! = In C ++ 20 für viele Standardbibliothekstypen entfernt?

44

Nach cppreference , std::type_info::operator!=wird mit C ++ entfernt 20 jedoch std::type_info::operator==bleibt offenbar.

Was ist der Grund dafür? Ich könnte zustimmen, dass ein Vergleich auf Ungleichheit bedeutungslos ist, aber ein Vergleich auf Gleichheit wäre genauso bedeutungslos, nicht wahr?

In ähnlicher Weise werden operator!=von vielen anderen Standardbibliothekstypen, einschließlich Containern wie std::unordered_map::operator!=und std::unordered_set::operator!=in C ++ 20, gemäß cppreference entfernt.

Das Schreiben if(!(id1 == id2))macht keinen Code klarer als if(id1 != id2)das Gegenteil ...

Aconcagua
quelle

Antworten:

62

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 != bumgeschrieben !(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::queueund std::stack: Ich vermute, dass die Abwärtskompatibilität bei Verwendung mit Containern von Drittanbietern erhalten bleiben soll, falls die Gleichheitsoperatoren nicht symmetrisch sind.

N. Shead
quelle
7
p1614 könnte ebenfalls von Interesse sein, da ich glaube, dass dies der Vorschlag war, der die Überlastungen beseitigt hat.
N. Shead
39

Wir brauchen keine Bibliothek operator!=mehr. Die Bereitstellung operator==ermöglicht dem Compiler einige Jonglieren und bewerten zu tun a != bin Bezug auf a == b, alle auf ihre eigene.

[over.match.oper]

3 Für einen unären Operator @ mit einem Operanden eines Typs, dessen cv-unqualifizierte Version T1 ist, und für einen binären Operator @ mit einem linken Operanden eines Typs, dessen cv-unqualifizierte Version T1 ist, und einem rechten Operanden eines Typs, dessen cv- Die unqualifizierte Version ist T2. Vier Sätze von Kandidatenfunktionen, designierte Mitgliedskandidaten, Nichtmitgliedskandidaten, integrierte Kandidaten und umgeschriebene Kandidaten sind wie folgt aufgebaut:

3.4.3 Für den Operator! = ([Expr.eq]) enthalten die umgeschriebenen Kandidaten alle nicht umgeschriebenen Kandidaten für den Ausdruck x == y.

std::type_infound viele weitere Bibliothekstypen operator!=wurden im Rahmen von P1614 - Das Mutterschiff ist gelandet entfernt .

Geschichtenerzähler - Unslander Monica
quelle