Сообщение Непонятка со "spaceship" operator от 11.08.2025 7:14
Изменено 11.08.2025 8:40 rg45
Непонятка со "spaceship" operator
В продолжение этого разговора
Порылся там и сям, всё-таки, чего-то я не догоняю. Чем обосновывается, что в примере ниже компилятор генерирует операторы <, >, <=, >= и не генерирует == и != ?
http://coliru.stacked-crooked.com/a/6d22999b83ed0ba0
То есть, меньше или равно он может, а просто равно не может — как так?
Автор: rg45
Дата: 09.08.25
решил создать отдельную тему, чтоб не оффтопить там.Дата: 09.08.25
Порылся там и сям, всё-таки, чего-то я не догоняю. Чем обосновывается, что в примере ниже компилятор генерирует операторы <, >, <=, >= и не генерирует == и != ?
http://coliru.stacked-crooked.com/a/6d22999b83ed0ba0
#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{1}, rhs{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')
}То есть, меньше или равно он может, а просто равно не может — как так?
Непонятка со "spaceship" operator
В продолжение этого разговора
Порылся там и сям, всё-таки, чего-то я не догоняю. Чем обосновывается, что в примере ниже компилятор генерирует операторы <, >, <=, >= и не генерирует == и != ?
http://coliru.stacked-crooked.com/a/143b847878e683cb
То есть, меньше или равно он может, а просто равно не может — как так?
Автор: rg45
Дата: 09.08.25
решил создать отдельную тему, чтоб не оффтопить там.Дата: 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')
}То есть, меньше или равно он может, а просто равно не может — как так?