考虑以下示例:
#include <iostream>
#include <vector>
class A {
public:
A(const A&) = default;
A(A&&) = default;
A& operator=(const A&) = default;
A& operator=(A&&) = default;
A() = default;
~A() {
std::cout << "~A()\n";
}
};
int main() {
std::vector<A> v1;
std::vector<A> v2;
v1.emplace_back();
v1 = std::move(v2);
std::cout << "moved\n";
}
输出为:
~A()
moved
我的问题是:我可以依靠
std::move
来破坏v1
里面的元素吗?或者换句话说,上面的输出是否有保证,或者我可以得到:
moved
~A()
如果后者是可能的,那将是令人惊讶的,但是我没有找到明确的答案,也没有在标准中找到任何明确的内容。如果移动赋值运算符是用
std::swap
或类似的实现,那可能会发生,但我没有找到关于这是否有效的可靠答案。
虽然交换通常是移动分配的有效实现,但标准库容器有额外的要求。 表 73:
表情:
a = rv
返回类型:X&
操作语义:的所有现有元素要么被移动分配给要么被销毁a
断言/注意前置/后置条件:后置条件:等于a
在此赋值之前的值rv
复杂度:线性
所以交换是不够的,因为那不会移动分配给或破坏原来的
v1[0]