Во время стандартизации этой функции было решено, что равенство и порядок должны быть логически разделены. Таким образом, использование тестирования на равенство (==
и !=
) никогда не вызовет operator<=>
. Тем не менее, все еще считалось полезным иметь возможность использовать их по умолчанию в одном объявлении. Поэтому, если вы зададите значение по умолчанию operator<=>
, было решено, что вы также имели в виду значение по умолчанию operator==
(если вы не определили его позже или определили его ранее).
Что касается , почему было принято это решение , основные рассуждения таковы. Рассмотрим std::string
. Порядок двух строк лексикографический;каждый символ имеет свое целочисленное значение по сравнению с каждым символом в другой строке. Первое неравенство приводит к результату упорядочения.
Однако проверка равенства строк имеет короткое замыкание. Если две строки не имеют одинаковую длину, тогда нет смысла делать посимвольное сравнение вообще;они не равны. Так что, если кто-то проводит тестирование на равенство, вы не хотите делать его длинным, если можете его замкнуть.
Оказывается, что многие типы, для которых требуется определенный пользователем порядок, также предлагают некоторыемеханизм короткого замыкания для проверки на равенство. Чтобы люди не могли реализовать только operator<=>
и потерять потенциальную производительность, мы фактически заставляем всех делать то и другое.