LINUX.ORG.RU

Почему operator<=>() не генерирует operator==()?

 


1

2
struct X {
    std::string s;
    inline auto operator <=>(const X& x) const { return s <=> x.s; }
};

https://godbolt.org/z/E8Y5Y3bs5

В итоге определены все операции сравнения кроме ==. (Во, теперь ещё и != неопределён. Только что ж пробовал.) Наличие constructor/assignment не влияет.

И самое смешное, в точно такой же структуре (с конструкторами, объявлена внутри namespace dimgel и по-другому называется) в моём проекте не определён ещё и operator<(). Что это за долбаная магия?

★★★★★

Последнее исправление: maxcom (всего исправлений: 5)

вообще-то оператор == более базовый, чем <=>.

равенство(идентичность в той или иной форме) определено вообще на любом множестве. а <=> определен только на упорядоченном множестве. то есть оператор <=> «слабее», чем ==.

видимо потому определение <=> не определяет ==, а из == выводится !=

alysnix ★★★
()
Ответ на: комментарий от alysnix

С производительностью вопросы тоже есть - нельзя написать одинаково эффективно все операторы сравнения, нам всегда надо будет сравнивать две строки (для примера) лексикографически тогда как в случае operator== можно обойтись сравнением их size()’ов. Например имеем: «hello» == «hello world» зачем здесь проходить все символы в цикле с целью узнать кто же там первее, если можно быстро сравнить размеры? Очевидный оверхед.

kvpfs ★★
()
Ответ на: комментарий от alysnix

*сильнее/строже а не слабее. Потому что <=> задает более узкую категорию.

anonymous
()
Ответ на: комментарий от kvpfs

нельзя написать одинаково эффективно все операторы сравнения, нам всегда надо будет сравнивать две строки (для примера) лексикографически тогда как в случае operator== можно обойтись сравнением их size()’ов

Вот так понятней, сенькс. Хотя собственно решение не генерить == всё равно под вопросом: если программист может написать более оптимальный ==, дык пусть рядышком с <=> и напишет, а компилятор в этом случае не будет генерить == из <=>. (Полагаю, так и сейчас: кастомное имеет более высокий приоритет чем сгенерированное из <=>.) А в подклассах <=> тогда должен подцепить этот кастомный «оверлоад».

dimgel ★★★★★
() автор топика
Ответ на: комментарий от kolpakchi

Контейнеры хранят свой размер, зачем тут какие-то доп телодвижения.

kvpfs ★★
()
Ответ на: комментарий от dimgel

а компилятор в этом случае не будет генерить == из <=>

при auto operator<=>(const X& x) const = default; компилятор генерирует две фунции,

operator <=> и operator ==

и для == не используется <=>, а != определена как !(a==b).

https://godbolt.org/z/57EzGqoda

даже если оператора == нет, то всё равно не будет выводиться через <=>, а будет ошибка: https://godbolt.org/z/xefEhE6b8

fsb4000 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.