处理本地引用变量

时间:2017-03-02 08:16:59

标签: c++

我期待以下代码导致未定义的行为:

#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);
    }

2 个答案:

答案 0 :(得分:2)

有几点需要注意:

  • 当你有UB时,程序可以以任何方式运行,包括它“正确”工作的可能性(即给出预期的结果)
  • 没有“空参考”这样的东西

您的代码本身很好,可以将对象的引用超出范围。在引用之前让被引用的对象超出范围是不正确的(但请注意,有时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。

  1. ref仅存在于嵌套范围内。它不能在嵌套范围之外使用。它不会改变i的生命。
  2. i的值在嵌套范围内通过ref更改。嵌套范围结束后,i仍然存在。