Как правильно перегрузить оператор <=> с++20
Я пытаюсь перегрузить оператора <=>, но следующий код выдает ошибку компиляции
error: no match for ‘operator==’ (operand types are ‘example’ and ‘example’)
struct example {
int a{0};
int b{0};
auto operator <=>(const example& other) const{
return a<=>other.a;
}
};
int main() {
example a{1, 2};
example b{1, 3};
a == b;
return 0;
}
при это если я напишу auto operator <=>(const example& other) const = default;
ошибки компиляции не будет. Но я не могу писать default, так как мне нужна слегка измененная логика. Операторы <> работают.
Ответы (1 шт):
Если вы определяете "ракету" не по умолчанию, то операторы == (и, не обязательно, !=) вы должны определить самостоятельно.
Пользовательский оператор <=> отключает генерацию равенства.
Ну, как если вы определяете пользовательский конструктор — всё, компилятор генерировать конструктор по умолчанию не станет. Так и здесь.
Так что определите свой оператор
auto operator ==(const example& other) const{
return a==other.a;
}
и все заработает. Вот если есть оператор ==, и нет оператора !=, то этот оператор неравенства будет сгенерирован из оператора равенства, как отрицание его результата.