Существует два простых класса:
class X
{
int value;
public:
X() : value(0) {};
X(int v) : value(v) {};
X(const X& x) { // Does not help!
this->value = x.value;
}
X(const X&& x) noexcept { // Does not help!
this->value = x.value;
}
X& operator=(const X& right) { // Does not help!
this->value = right.value;
return *this;
};
X&& operator=(const X&& right) noexcept { // Does not help!
this->value = right.value;
return std::move(*this);
};
bool operator==(X& right) const {
return this->value == right.value;
};
};
class Y
{
int value;
public:
Y() : value(0) {};
operator X() const {
return X(this->value);
}; // Y objects may be converted to X
};
и пример использования:
int main()
{
X x1, x2;
Y y1;
x1 = x2; // Compiles (using the X& operator=)
x1 = std::move(x2); // Compiles (using the X&& operator=)
auto newv = (X)y1; // Compiles
x1 == newv; // Accepted!
x1 == (X)y1; // Error!!!
} // END: main()
x1 == (X) y1 строка генерирует ошибку C2678: binary '= = ': не найден оператор, который принимает левый операнд типа' X '(или нет приемлемого преобразования)
и "no operator == соответствует этим операндам, типы операндов X == X
Я пытаюсь скомпилировать его с C ++ 17.
Что с ним не так, если строка типа "x1 == newv" подходит для компилятора?