在本地参考变量上工作

Working on a local reference variable

本文关键字:工作 变量 参考      更新时间:2023-10-16

我期望以下代码导致不确定的行为:

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

要注意的几件事:

  • 当您拥有UB时,该程序可以以任何方式行事,包括"正确"工作的可能性(即给出预期结果)
  • 没有"空参考"之类的东西

您的代码本身很好,可以参考对象的引用不范围。在引用之前,请参考的对象出现在范围内(但请注意,在某些情况下,const引用延长对象的寿命),然后尝试通过参考尝试使用它。

您的代码很好。

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继续活着。