【发布时间】:2013-02-23 21:17:10
【问题描述】:
所以我看到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
}
【问题讨论】:
-
向量可以重新分配
-
当它被初始化的底层动态分配被从它下面抹去时,你认为你的引用是什么“引用”?
-
我不明白,你怎么能在重新分配后将对象移动到新位置并仍然期望旧的仍然存在?!
-
@Dukeling 查看 Matteo 的更新答案。引用比指针更具限制性,并且遵循更严格的规则。而且您的建议对指针也无效,所以我仍然不明白为什么您认为它会受到引用的支持。 有一些容器以您描述的方式支持实时引用,但向量不是其中之一。对于这样的容器,请参见
std::deque,但仅当插入物位于任一端时。
标签: c++ stl reference iterator