В оригинальном проекте оператора космического корабля ==
разрешено вызывать <=>
, но это позже запрещено из-за проблем эффективности (<=>
, как правило, является неэффективным способом реализации ==
). operator<=>() = default
по-прежнему определяется для неявного определения operator==
, что для удобства правильно вызывает ==
вместо <=>
для членов. Итак, что вы хотите, это:
struct A {
int n;
auto operator<=>(const A& rhs) const noexcept = default;
};
// ^^^ basically expands to vvv
struct B {
int n;
bool operator==(const B& rhs) const noexcept
{
return n == rhs.n;
}
auto operator<=>(const B& rhs) const noexcept
{
return n <=> rhs.n;
}
};
Обратите внимание, что вы можете независимо по умолчанию operator==
, в то же время предоставляя пользовательский operator<=>
:
struct B {
int n;
// note: return type for defaulted equality comparison operator
// must be 'bool', not 'auto'
bool operator==(const B& rhs) const noexcept = default;
auto operator<=>(const B& rhs) const noexcept
{
return n <=> rhs.n;
}
};