如果我有一个向量迭代器a
,然后我移动构造或移动分配向量b
from a
,该迭代器是否仍然指向同一个元素(现在在向量中)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;
}
Is a_iter
至今仍然有效a
已移入b
,或者迭代器是否因移动而失效?以供参考,std::vector::swap
不会使迭代器失效.
虽然假设可能是合理的iterator
s 后仍然有效move
,我认为该标准实际上并不能保证这一点。因此,迭代器在执行之后处于未定义状态move
.
我在标准中找不到参考资料特别指出在 a 之前存在的迭代器move
仍然有效after the move
.
从表面上看,假设iterator
is 通常作为指向受控序列的指针来实现。如果是这样的话,那么迭代器在之后仍然有效move
.
但实施一个iterator
是实现定义的。意思是,只要iterator
在特定平台上满足标准规定的要求,可以以任何方式实现。理论上,它可以作为返回指针的组合来实现vector
类和索引。如果that's在这种情况下,迭代器将在move
.
无论是否iterator
实际上以这种方式实现是无关紧要的。它可以通过这种方式实施,因此没有标准的具体保证move
迭代器仍然有效,但你不能假设它们是有效的。还要记住,有is迭代器之后的这样的保证swap
。此前的标准对此进行了明确的明确。也许这只是标准委员会的一个疏忽,没有对迭代器做出类似的澄清。move
,但无论如何都没有这样的保证。
因此,总而言之,你不能假设你的迭代器在经过一段时间后仍然很好。move
.
EDIT:
草案 n3242 中的 23.2.1/11 指出:
除非另有说明(明确或通过定义
函数(就其他函数而言),调用容器成员
函数或将容器作为参数传递给库函数
不得使对象的迭代器无效或更改对象的值
在那个容器内。
这可能会导致人们得出这样的结论:迭代器在经过一段时间后仍然有效。move
,但我不同意。在您的示例代码中,a_iter
是一个迭代器vector
a
。之后move
,那个容器,a
肯定已经改变了。我的结论是上述条款不适用于本案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)