标准是否保证移动语义?
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。
我想我大体上理解了移动语义的要点,但我想知道,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 asrv
had before this construction;...
请注意“相同元素”,而不是“具有相同内容的元素”。例如,在
之后std::vector<int> otherVec = std::move(myVec);
otherVec
的第一个元素因此必须与此移动构造之前 myVec
的第一个元素完全相同 element/object。