The fundamental reason is so that C++ objects can preserve class invariants involving the address of the object (or its sub-objects)
Therefore if the value of an object is to be established at a different address the class might need to execute code to preserve the invariant. That code goes in the move/copy constructor/assignment and the swap function if applicable.
A (possibly over-elaborate) example of such an invariant is, "exactly one sub-object is registered with some global collection of pointers, but which one varies between objects". If all you do is copy the bits, then there's no opportunity to update the global collection with the "right" sub-object according to the object state.
There is a serious limitation in C++03, that there are classes for which it is appropriate to just copy all the bits in the case you describe, but where it is not appropriate to just copy all the bits for a copy assignment in general, and a copy is unnecessarily expensive in your case. That limitation is what C++11 move semantics address, giving the class the chance to behave differently.