Кто-нибудь знает, почему я получаю ошибку компилятора для операции равенства в классе, который имеет переопределение трехстороннего оператора? Я использую VS 2019.
class Rectangle
{
public:
constexpr Rectangle(const int width, const int height) :
width{ width }, height{ height } { }
auto operator<=>(const Rectangle& rhs) const {
return width * height <=> rhs.width * rhs.height;
}
int width;
int height;
};
void Test() {
Rectangle r1(5, 10);
Rectangle r2(10, 5);
auto ret1 = r1 < r2;
auto ret2 = r1 <= r2;
auto ret3 = r1 == r2; // error on this line but previous two are good
}
Я получаю сообщение об ошибке для указанной выше строки: NativeConsoleApp.cpp (68,20): error C2676: binary '==': 'Rectangle' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора
Изменить: обратите внимание на объяснение на странице не заданный по умолчанию оператор ‹=› не generate == и! = в C ++ 20 не объясняет, почему работают операторы неравенства, но не оператор равенства.
Изменить: ссылка выше имеет смысл теперь после перечитывания ее месяцем позже.
operator<=>
: я сомневаюсь, чтоRectangle{1,6}
следует считать равнымRectangle{2,3}
- person limserhane   schedule 07.01.2021==
. Таким образом, вместо того, чтобы генерировать бессмысленное значение по умолчанию, язык оставляет это на усмотрение программиста. Во время стандартизации этой функции было решено логически разделить равенство и порядок. Таким образом, использование проверки равенства (==
и!=
) никогда не вызоветoperator<=>
. - person HTNW   schedule 07.01.2021