Well, the standard says:
13.5.3 Assignment
An assignment operator shall be implemented by a non-static member function with exactly one parameter.
It is possible to add a contructor to make Y assignable to X (in which case the constructor would do the hard work).

Code:
struct Y {};

struct X
{
    X() {}
    X(const Y&) {}
};

int main()
{
    X x;
    Y y;
    x = y;
}