所以我看到this question,基本上说引用和迭代器一起失效。
我明白为什么迭代器在某些情况下会失效,但为什么引用无效?
从实际的角度来看,我不明白为什么要这样做。
这只是一个设计决定还是有一些实际的原因?
编辑:为了澄清,据我了解底层结构,它只是指向需要重新分配的数据的指针(数据(因此对它的引用)可以保持不变)。正确?
一些测试代码:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<string> yourVect;
yourVect.push_back("def");
vector<string>::iterator iter = yourVect.begin();
const string& ref = *iter;
yourVect.insert(yourVect.begin(), "abc");
cout << ref << endl; // !! --- doesn't work - why ?? --- !!
cout << *iter << endl; // obviously doesn't work
}
答案 0 :(得分:2)
如果您在向量的开头插入一个字符串,则所有数据都必须向前移动一个位置,如果vector
的容量用尽,则vector
必须重新分配
所以,最好参考现在将引用不同的数据,最坏的情况是它将引用无效的内存位置:如果向量重新分配,则分配新的内存块,旧的数据被复制 1 在新块中,旧块被解除分配;由于所有旧引用都指向旧块内的内存位置,因此它们都将无效。
保证意味着“最坏情况”,这就是为什么不能保证在insert
操作之后,引用仍然有效。或者,以另一种方式说,插入向量可能使迭代器和引用无效。
另外,我不明白为什么你认为引用和迭代器之间的这种行为有很大差异 - vector
迭代器通常只是指向引用的vector
位置的指针(通常隐藏在里面)实现定义的类),因此它与引用或多或少相同。
std::move
中);这并没有改变旧引用将继续指向当时释放的内存的事实。