In adition to SiCrane's example, another thing that could complicate moving is pointers into the object itself. For example, a small vector might have a pointer that points within the object when there are few members, and to allocated memory when there are lots. That pointer would need to be updated to point within the moved object.
I understand that std::move(), std::memcpy(), and normal copying all copy bytes around. But in the context of C++ a move is different than a copy. So yes I am talking about std::memcpy(), but I'm talking about move semantics not copy semantics. POD types and std::is_trivially_copyable refer to copy semantics. For example a class like:struct Object { char* data; Object () : data(new char[10]); virtual ~Object () { delete[] data; } };
is not trivially copyable (you'd have two objects pointing to the same data on the heap), but... is it trivially moveable? There are no exceptions thrown. The pointer will move properly with a std::memcpy(), as there will be still only one owner. As long as the src isn't destructed we don't have a data leak. Does the hidden v-table pointer get copied properly? Will something else get mangled?
I hope that makes my question clearer.
One of the things that a move constructor needs to do is leave the source object in a destructable state. So a just a memmove wouldn't be enough here.