我期待以下代码导致未定义的行为:
#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;
}
我将我的vector元素引用到局部变量然后递增它。 我期望当局部变量的生命周期结束时,向量的内存也会被清理,导致空引用。 除了它确实提供了正确的输出 这是编译器足够智能并修复此行为,或者这是一种可接受的编码方式吗?
我使用g ++(GCC)5.3.0编译
修改
为了说明我的主要困惑,我错误地认为引用创建了某种类似于原始变量声明方式的硬链接。
在我目前的理解中,以下使用指针等于:
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T* local = &v[index];
++(*local);
}
答案 0 :(得分:2)
有几点需要注意:
您的代码本身很好,可以将对象的引用超出范围。在引用之前让被引用的对象超出范围是不正确的(但请注意,有时const引用会延长对象的生命周期),然后尝试通过引用使用它。
答案 1 :(得分:1)
你的代码很好。
for(typename vector<T>::size_type index = 0; index < v.size(); ++index)
{
T& local = v[index];
++local;
}
类似于
int i = 0;
{
int& ref = i;
++ref; // Changes the value of i
}
最后,您会看到i
的值为1。
ref
仅存在于嵌套范围内。它不能在嵌套范围之外使用。它不会改变i
的生命。i
的值在嵌套范围内通过ref
更改。嵌套范围结束后,i
仍然存在。