Оператор равенства не определен для пользовательской реализации оператора космического корабля в C ++ 20

Я столкнулся со странным поведением с новым оператором космического корабля <=> в C ++ 20. Я использую компилятор Visual Studio 2019 с /std:c++latest.

Этот код компилируется нормально, как и ожидалось:

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};

int main()
{
    X a, b;

    a == b; // OK!

    return 0;
}

Однако, если я изменю X на это:

struct X
{
    int Dummy = 0;
    auto operator<=>(const X& other) const
    {
        return Dummy <=> other.Dummy;
    }
};

Я получаю следующую ошибку компилятора :

error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator

Я попробовал это и на Clang, и у меня похожее поведение.

Я был бы признателен за объяснение того, почему реализация по умолчанию генерирует operator== правильно, а пользовательская - нет.

39
задан Miljen Mikic 14 November 2019 в 12:57
поделиться