【发布时间】:2012-06-16 19:36:44
【问题描述】:
如果我有一个指向向量a 的迭代器,那么我从a 移动构造或移动分配向量b,该迭代器是否仍指向同一个元素(现在在向量b 中)?这就是我在代码中的意思:
#include <vector>
#include <iostream>
int main(int argc, char *argv[])
{
std::vector<int>::iterator a_iter;
std::vector<int> b;
{
std::vector<int> a{1, 2, 3, 4, 5};
a_iter = a.begin() + 2;
b = std::move(a);
}
std::cout << *a_iter << std::endl; // Is a_iter valid here?
return 0;
}
a_iter 是否仍然有效,因为 a 已被移动到 b,或者迭代器是否因移动而失效?供参考,std::vector::swapdoes not invalidate iterators。
【问题讨论】:
-
@chris 我希望
a_iter现在在移动a后引用b中的元素。 -
学究式——你没有移动构造,你移动分配。
-
@Thomash:如果答案是它确实使迭代器无效,那么取消引用它们是未定义的行为,那么你将如何测试它?
-
我想不出迭代器无效的原因,但我在标准中找不到任何引用来支持这一点......因为交换后迭代器的有效性很好 -定义,认为在移动时可以应用相同的推理似乎是合理的(如果我们考虑如何实现
vectors,则更是如此)。 -
@Luc:如果迭代器类本身维护指向向量类的指针,则迭代器可能会失效。只是随地吐痰。