返回对函数范围变量的引用作为值是否未定义?

时间:2018-07-30 09:22:55

标签: c++ reference pass-by-value

下面的代码合法吗?

int foo()
{
    int local = 5;
    int& local_ref = local;
    return local_ref;
}

如果是,那么很可能会将local的值复制到返回值之前销毁local,但是为什么呢? GCC和MSVC都没有对此抱怨,所以可能是合法的……不是吗?

1 个答案:

答案 0 :(得分:0)

有效。 locallocal_ref都在之前复制了值。另一方面,返回本地引用将调用未定义的行为。通过本地引用,我的意思是int& foo(),而不是变量local_ref


在调用函数之前,将创建堆栈帧(堆栈上用于存储参数,返回值的空间,并在其中保存当前程序计数器)。然后,在函数执行期间,局部变量(locallocal_ref)被构造在堆栈上。在程序计数器离开功能范围之前,将返回值(value)复制到函数堆栈框架,并在此之后 ,程序计数器返回到存储在堆栈框架中的位置(从此处开始) foo被叫来。)

有关更多信息,请搜索堆栈框架。