move(...) uses move(T) which returns an xvalue reference type. How this xvalue ref type is processed by the caller (eg on the right side of an assignment with operator=() overload) is down to the caller. The caller can even ignore an xvalue ref and treat as a value. All you can rely upon is that after move(), the value used in move() is left in an unspecified but valid state. The emphasis being on unspecified.
std::move is used to indicate that an object may be "moved from". It does nothing else!
Move constructors and move assignment operators can make use of this as a sort of shortcut that allows them to "steal" resources from the original object, instead of having to actually duplicate those resources. Therefore, after an object was actually "moved from", that object is left in an "unspecified" (but valid) state. But, by no means, you have any guarantee that the object which was "moved from" has been "erased". The move constructors or move assignment operator simply leaves the original object in whatever state it deems convenient...
(In other words, the move constructors or move assignment operator will not do any extra work to "clean up" the original object; they just "take" whatever resources they want to re-use and then they do the minimal amount of work that is required to ensure that the original object will be in some "valid" state – since leaving the object in a "broken" state is not allowed – but do not expect more)