Непонятка со "spaceship" operator
От: rg45 СССР  
Дата: 11.08.25 07:14
Оценка:
В продолжение этого разговора
Автор: rg45
Дата: 09.08.25
решил создать отдельную тему, чтоб не оффтопить там.

Порылся там и сям, всё-таки, чего-то я не догоняю. Чем обосновывается, что в примере ниже компилятор генерирует операторы <, >, <=, >= и не генерирует == и != ?

http://coliru.stacked-crooked.com/a/143b847878e683cb

#include <iostream>

struct A {
    int id{};
// . . . More members . . .    

    auto operator <=> (const A& rhs) const { return id <=> rhs.id; }
};

int main() {
    auto test = [](bool t) {std::cout << std::boolalpha << t << std::endl; };
    
    A lhs{.id = 1}, rhs{.id = 2};

    test(lhs < rhs); // true
    test(lhs > rhs); // false
    test(lhs <= rhs); // true
    test(lhs >= rhs); // false

    test(lhs == rhs); // error: no match for 'operator==' (operand types are 'A' and 'A')
    test(lhs != rhs); // error: no match for 'operator!=' (operand types are 'A' and 'A')
}


То есть, меньше или равно он может, а просто равно не может — как так?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 11.08.2025 8:40 rg45 . Предыдущая версия .
Re: Непонятка со "spaceship" operator
От: so5team https://stiffstream.com
Дата: 11.08.25 07:30
Оценка: 22 (3) +1
Здравствуйте, rg45, Вы писали:

R>В продолжение этого разговора
Автор: rg45
Дата: 09.08.25
решил создать отдельную тему, чтоб не оффтопить там.


R>Порылся там и сям, всё-таки, чего-то я не догоняю. Чем обосновывается, что в примере ниже компилятор генерирует операторы <, >, <=, >= и не генерирует == и != ?


Этот ответ на Stackoverflow уже видели?
https://stackoverflow.com/a/68221126
Там еще есть ссылка на раздел из пропозала P1185
Re[2]: Непонятка со "spaceship" operator
От: rg45 СССР  
Дата: 11.08.25 10:23
Оценка:
Здравствуйте, so5team, Вы писали:

S>Этот ответ на Stackoverflow уже видели?

S>https://stackoverflow.com/a/68221126
S>Там еще есть ссылка на раздел из пропозала P1185

Забавно, что на практике я сам многократно сталкивался с тем, что оператор == можно реализовать несоизмеримо оптимальнее, чем посредством операторов < и >. Вектора и строки — отличная тому иллюстрация. То же самое относится и к пользовательскому оператору <=>. И это уже веский довод в пользу того, чтобы тормознуть автоматическую генерацию. Вообще, должен был сам это сообразить, а вот, не сообразил.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 11.08.2025 10:25 rg45 . Предыдущая версия . Еще …
Отредактировано 11.08.2025 10:24 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.