В C ++ 20 был изменен способ работы реляционных операторов, особенно с введением <=>
оператора космического корабля . В частности, если вы только предоставляете operator==
, то a != b
переписывается на !(a == b)
.
Из [over.match.oper] /3.4 :
Переписанный набор кандидатов определяется следующим образом:
- Для реляционных ([expr.rel]) операторов переписанные кандидаты включают все не переписанные кандидаты в выражение x <=> y.
- Для операторов реляционного ([expr.rel]) и трехстороннего сравнения ([expr.spaceship]) переписанные кандидаты также включают в себя синтезированный кандидат с обратным порядком двух параметров для каждого не переписанного кандидата для выражение у <=> х.
- Для оператора! = ([Expr.eq]) переписанные кандидаты включают в себя все не переписанные кандидаты для выражения x == y.
- Для операторов равенства переписанные кандидаты также включают в себя синтезированный кандидат с обратным порядком двух параметров для каждого не переписанного кандидата для выражения y == x.
- Для всех остальных операторов переписанный набор кандидатов пуст.
И [over.match.oper] / 9 :
Если переписанный оператор == кандидат выбран разрешением перегрузки для оператора @, его тип возвращаемого значения должен быть cv bool, а x @ y интерпретируется как:
- если @ =! = и выбранный кандидат является синтезированным кандидатом с обратным порядком параметров,! (y == x),
- в противном случае, если @ =! =,! (x == y) ,
- в противном случае (когда @ ==), y == x,
в каждом случае используется выбранный переписанный оператор == кандидат.
Таким образом, явная перегрузка для operator!=
более не требуется. Удаление оператора не изменило семантику сравнения.
operator!=
Насколько я могу судить, все контейнеры были удалены (см., Например, векторный синопсис ). Единственными исключениями являются адаптеры контейнеров std::queue
и std::stack
: я предполагаю, что он должен сохранять обратную совместимость при использовании со сторонними контейнерами, если операторы равенства не симметричны.