Почему операторы сравнения были удалены из контейнеров стандартной библиотеки в C ++ 20? - PullRequest
9 голосов
/ 02 апреля 2020

Я просматривал cppreference и увидел, что операции сравнения vector были удалены в C ++ 20 и введен оператор космического корабля (<=>). То же самое можно увидеть и для многих других стандартных библиотечных контейнеров, таких как set и map.

Как выполнить сравнения в новом стандарте? Кроме того, C ++ 20 начнет давать ошибки в старом коде?

1 Ответ

14 голосов
/ 02 апреля 2020

Если вы продолжите немного просматривать справочный сайт, вы можете перейти к разделу сравнения по умолчанию , в котором просто говорится:

Вкратце, класс, который определяет operator<=>, автоматически получает сгенерированные компилятором операторы <, <=, > и >=.

Итак, если "космический корабль" оператор существует для класса, компилятор автоматически сгенерирует оставшиеся операторы сравнения, используя результат оператора <=>.

Обратите внимание, что оператор == генерируется , а не (даже хотя это должно быть возможно), но std::vector сохраняет перегрузку operator==.


Что касается:

С ++ 20 начнет давать ошибки в старых кодах?

Нет, не будет.

При сборке с помощью компилятора C ++ 20 стандартная библиотека, используемая с ним, должна также быть сделана для C ++ 20 и, следовательно, реализовать оператор <=>, который затем будет использоваться, как описано выше.

Однако, если Вы используете компилятор C ++ 20 для сборки со старой стандартной библиотекой, в этой старой стандартной библиотеке все еще будут реализованы более старые операторы сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...