【发布时间】:2014-10-10 10:32:43
【问题描述】:
考虑这个例子:
std::vector<int> v1 = { 1, 2, 3 };
const int* i = &v1[1];
std::vector<int> v2(std::move(v1));
std::cout << *i << std::endl;
尽管在许多 STL 实现中这可能会起作用,但我是否保证在移动 std::vector 时不会执行重新分配,并且支持 v2 的内部缓冲区与过去相同v1 的?我无法在 Internet 和标准本身上找到此信息。
【问题讨论】:
-
如果标准没有说明它,那么我猜它是依赖于实现的。
-
N3797 中的表 99 说
X(rv),即从右值构造容器,必须具有 constant 复杂性(相对于 linear复制构造),我认为我们可以从中推断出元素在移动后必须驻留在相同的内存位置。但是并不一定意味着迭代器仍然有效 -
我认为在这种情况下不能保证,但如果你改为使用
std::vector<int> v2; v2.swap(v1);,那么它肯定是。 (23.2.1/10) -
@gd1 来自 LWG 2321:“容器的无移动构造函数 [...](
array除外)会使任何引用的引用、指针或迭代器无效源容器的元素。”