我期待下面的代码导致未定义的行为工作:在本地参考变量
#include <iostream>
#include <vector>
using namespace std;
template <class T>
void incrementElements(vector<T> &v)
{
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T& local = v[index];
++local;
}
}
int main(){
vector<int> v;
for(int i = 0; i < 10; ++i)
{
v.push_back(i);
cout << v[v.size() - 1] << endl;
}
incrementElements(v);
for(vector<int>::size_type index = 0; index < v.size(); ++index)
{
cout << v[index] << endl;
}
return 0;
}
我给一个参考我的矢量元素给一个局部变量,然后增加它。 我预计,当局部变量的生命周期结束矢量的记忆将得到清理,以及导致空引用。 除了它给出了正确的输出。
这是编译器是足够聪明和固定这种行为或者这是实现代码能够接受的方式?
我用G ++(GCC)5.3.0
编辑
要指定我的主要困惑编译,我错了的假设下,一个参考产生某种硬链接,这是等同于如何原始变量被声明。
在我目前的理解,是使用相同的指针如下:
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T* local = &v[index];
++(*local);
}
参考消失,而不是在元件内部'v'。同样做的是你想要的是未定义行为的可能结果,所以这不是检查它的好方法。 – nwp
参考资料永远不会缩短任何事物的寿命。你的循环体等同于'++ v [index];'。 – molbdnilo
载体的寿命结束时'main'退出:(附注C++中的单词“参考”并不意味着同样的事情,在Java和类似的语言“参考”字)。您可以在该生命周期中为矢量添加和删除名称;但是它的使用寿命保持原样 –