标准是否保证移动语义?

Are move semantics guaranteed by the standard?

我想我大体上理解了移动语义的要点,但我想知道,C++ 标准是否真的保证了像 std::vector 这样的标准类型的移动语义。例如,以下代码片段是否保证产生 check = true(如果使用的 compiler/std-lib 符合标准)?

std::vector<int> myVec;
int *myPtr = myVec.data();
std::vector<int> otherVec = std::move(myVec);
int *otherPtr = otherVec.data();

bool check = myPtr == otherPtr;

换句话说:当移动 a std::vector 时,标准是否保证我实际上会执行移动而不是复制(例如,因为使用的标准库尚未实现移动- std::vector)?

的构造函数

我相信 分配器感知容器 可以根据 [tab.container.alloc.req] 的以下要求得到保证:

X(rv) X u(rv); Postconditions: u has the same elements as rv had before this construction;...

请注意“相同元素”,而不是“具有相同内容的元素”。例如,在

之后
std::vector<int> otherVec = std::move(myVec);

otherVec 的第一个元素因此必须与此移动构造之前 myVec 的第一个元素完全相同 element/object。