W C ++ 20 sposób działania operatorów relacyjnych został zmieniony, zwłaszcza wraz z wprowadzeniem <=>
operatora statku kosmicznego . W szczególności Jeśli podasz tylko operator==
, a != b
zostanie przepisane na !(a == b)
.
Od [over.match.oper] /3.4 :
Przepisany zestaw kandydatów jest określany w następujący sposób:
- W przypadku operatorów relacyjnych ([expr.rel]) ponownie przepisani kandydaci obejmują wszystkich nieodpisanych kandydatów na wyrażenie x <=> y.
- W przypadku operatorów relacyjnych ([wyraż. Rel.]) I trójstronnego porównania ([wyraż. Kosm.]) Przepisani kandydaci zawierają również kandydata zsyntetyzowanego, z odwróconą kolejnością dwóch parametrów, dla każdego nie przepisanego kandydata dla wyrażenie y <=> x.
- W przypadku operatora! = ([Wyraż. Eq]) przepisani kandydaci obejmują wszystkich kandydatów, którzy nie przepisali wyrażenia x == y.
- W przypadku operatorów równości, przepisani kandydaci zawierają również kandydata zsyntetyzowanego, z odwróconą kolejnością dwóch parametrów, dla każdego nie przepisanego kandydata dla wyrażenia y == x.
- W przypadku wszystkich innych operatorów przepisany zestaw kandydatów jest pusty.
I [over.match.oper] / 9 :
Jeśli przepisany operator == zostanie wybrany przez rozdzielczość przeciążenia dla operatora @, jego typem zwrotnym jest cv bool, a x @ y jest interpretowane jako:
- jeśli @ jest! = a wybrany kandydat jest zsyntetyzowanym kandydatem o odwróconej kolejności parametrów,! (y == x),
- w przeciwnym razie, jeśli @ to! =,! (x == y) ,
- w przeciwnym razie (gdy @ to ==), y == x,
w każdym przypadku przy użyciu wybranego przepisanego operatora == kandydat.
W związku z tym wyraźne przeciążenie operator!=
nie jest już konieczne. Usunięcie operatora nie zmieniło semantyki porównania.
operator!=
O ile mi wiadomo, wszystkie pojemniki zostały usunięte (sprawdź np . Streszczenie wektora ). Jedynymi wyjątkami są adaptery kontenerów std::queue
i std::stack
: zgaduję, że ma zachować wsteczną kompatybilność, gdy jest używana z kontenerami innych firm, na wypadek, gdyby operatory równości nie były symetryczne.
Nie potrzebujemy
operator!=
już dostarczonej biblioteki . Udostępnianieoperator==
pozwala kompilatorowi na samodzielne przeprowadzanie żonglowania i ocenianiea != b
pod względema == b
.std::type_info
i wiele innych typów bibliotek zostałooperator!=
usuniętych w ramach P1614 - The Mothership wylądował .źródło