以下程序是否包含悬空引用?

Does the following program contain a dangling reference?

提问人:ktqq99 提问时间:1/14/2023 更新时间:1/14/2023 访问量:49

问:

我有以下程序:

#include <iostream>
#include <string>

using namespace std;
using int_arr = int[3];

int& f(int_arr& arr, int index)
{
    return arr[index];
}

int main() {
    int arr[3] = {1, 2, 3};
    int& g = f(arr, 0);
    g = 5;

    std::cout << arr[0] << std::endl;
}

f 返回是否被视为悬空引用?arr[index]

我不认为这是一个悬空的引用,因为即使在返回后,该对象仍继续存在(因此引用是有效的),但我想确认我的理解。我编译了它,它编译得很好并产生了预期的输出。arrf-fsanitize=undefined

C++ 引用 悬空指针

评论

3赞 Richard Critten 1/14/2023
No 引用具有相同生存期的数组成员(在 的作用域中)。(为了这个问题,如果你用不同的名称调用本地和参数,可能会更好。garrmain

答:

1赞 Blindy 1/14/2023 #1

不,并且具有相同的生命周期,因此没有悬空的引用。arrg

但请注意,您可以使用函数轻松创建悬空引用:

int empty;
int& ref = empty;

int &f(int arr[], int idx) { return arr[idx]; }
void g()
{
    int arr[] = { 1, 2, 3 };
    ref = f(arr, 0);
}

int main()
{
    g();
    // ref is accesable here and complete garbage
}

评论

4赞 Blastfurnace 1/14/2023
我不认为你的例子正确地显示了一个悬空的引用。您无法重新绑定引用,因此内部的赋值只会更改“空”的值。g()int