RVO happens only because the C++ standard gives compilers a special license to ignore side effects in the copy constructor and the destructor of the temporary, which won't happen once the optimization is applied.
There is no such special license to ignore side effects in the assignment operator, so that can't be omitted. Furthermore, since a
is valid before it is assigned to, it would first have to be destructed so that a new object can be constructed in place. Not only is there no special license to ignore side effects introduced by this destructor call, what's worse is that the destruction would have to happen before the function call, and then where would you be if the function throws?