#include <iostream>
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& left) { // Does not help!
value = left.value;
return *this;
};
bool operator==(const X& right) const {
return this->value == right.value;
};
};
class Y
{
int value;
public:
operator X() const {
return X(this->value);
}; // Y objects may be converted to X
};
int main() {
X x1, x2;
Y y1;
x1 == x2; // Compiles
auto newv = (X)y1; // Compiles
x1 == newv; // Accepted!
x1 == (X)y1; // Error!!!
} // END: main()
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgWAp7CiAgICBpbnQgdmFsdWU7CgpwdWJsaWM6CgogICAgWCgpIDogdmFsdWUoMCkge307CgogICAgWChpbnQgdikgOiB2YWx1ZSh2KSB7fTsKCiAgICBYKGNvbnN0IFgmIHgpIHsgICAgIC8vIERvZXMgbm90IGhlbHAhCiAgICAgICAgdGhpcy0+dmFsdWUgPSB4LnZhbHVlOwogICAgfQoKICAgIFgoY29uc3QgWCYmIHgpIG5vZXhjZXB0IHsgLy8gRG9lcyBub3QgaGVscCEKICAgICAgICB0aGlzLT52YWx1ZSA9IHgudmFsdWU7CiAgICB9CgogICAgWCYgb3BlcmF0b3I9KGNvbnN0IFgmIGxlZnQpIHsgLy8gRG9lcyBub3QgaGVscCEKICAgICAgICB2YWx1ZSA9IGxlZnQudmFsdWU7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfTsKCgogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFgmIHJpZ2h0KSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHRoaXMtPnZhbHVlID09IHJpZ2h0LnZhbHVlOwogICAgfTsKCn07CgpjbGFzcyBZCnsKICAgIGludCB2YWx1ZTsKcHVibGljOgoKICAgIG9wZXJhdG9yIFgoKSBjb25zdCB7CgogICAgICAgIHJldHVybiBYKHRoaXMtPnZhbHVlKTsKCiAgICB9OyAgLy8gWSBvYmplY3RzIG1heSBiZSBjb252ZXJ0ZWQgdG8gWAp9OwoKaW50IG1haW4oKSB7CgpYIHgxLCB4MjsKWSB5MTsKCngxID09IHgyOyAgIC8vIENvbXBpbGVzIAoKYXV0byBuZXd2ID0gKFgpeTE7IC8vIENvbXBpbGVzIAoKeDEgPT0gbmV3djsgICAvLyBBY2NlcHRlZCEKCngxID09IChYKXkxOyAgIC8vIEVycm9yISEhCgp9IC8vIEVORDogbWFpbigp