У C ++ 20 спосіб роботи реляційних операторів був змінений, зокрема, із введенням <=>
оператора космічного корабля . Зокрема, якщо ви лише надаєте operator==
, то a != b
це переписується на !(a == b)
.
Від [over.match.oper] /3.4 :
Переписаний набір кандидатів визначається наступним чином:
- Для реляційних ([expr.rel]) операторів переписані кандидати включають усіх непереписаних кандидатів для виразу x <=> y.
- Для операторів реляційного ([expr.rel]) і тристороннього порівняння ([expr.spaceship]) переписані кандидати також включають синтезований кандидат з порядком двох змін параметрів для кожного непереписаного кандидата для вираз y <=> x.
- Для оператора! = ([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
: я гадаю, що це збереження зворотної сумісності при використанні з сторонніми контейнерами, якщо оператори рівності не симетричні.