Почему оператор космического корабля не позволяет мне выполнять операцию равенства, но разрешает операции неравенства?

Кто-нибудь знает, почему я получаю ошибку компилятора для операции равенства в классе, который имеет переопределение трехстороннего оператора? Я использую 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 не объясняет, почему работают операторы неравенства, но не оператор равенства.

Изменить: ссылка выше имеет смысл теперь после перечитывания ее месяцем позже.


person adamtki    schedule 06.01.2021    source источник
comment
(не ответ на ваш вопрос) Остерегайтесь семантики реализации operator<=>: я сомневаюсь, что Rectangle{1,6} следует считать равным Rectangle{2,3}   -  person limserhane    schedule 07.01.2021
comment
Это не пример из реального мира. Я просто создал классы, чтобы понять, как использовать оператор космического корабля.   -  person adamtki    schedule 07.01.2021
comment
В ответах очень много действительно объясняется, почему работают операторы неравенства, а не оператор равенства ?? Если класс делает что-то особенное в своем трехстороннем сравнении, ему, вероятно, нужно будет сделать что-то особенное в своем ==. Таким образом, вместо того, чтобы генерировать бессмысленное значение по умолчанию, язык оставляет это на усмотрение программиста. Во время стандартизации этой функции было решено логически разделить равенство и порядок. Таким образом, использование проверки равенства (== и !=) никогда не вызовет operator<=>.   -  person HTNW    schedule 07.01.2021
comment
Да вы правы. Теперь имеет смысл прочитать его снова через месяц.   -  person adamtki    schedule 03.03.2021