首页 > 解决方案 > 将函数范围变量的引用作为值返回是否未定义?

问题描述

下面的代码合法吗?

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

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

标签: c++referencepass-by-value

解决方案


它有效。该值在两者之前local被复制并local_ref超出范围。另一方面,返回本地引用会调用未定义的行为。我的意思是本地引用,int& foo()而不是变量local_ref


在调用函数之前,会创建堆栈帧(堆栈空间用于参数、返回值以及作为其中一部分的当前程序计数器被保存)。然后在函数执行期间,在堆栈上构造局部变量 (local和)。local_ref在程序计数器离开函数范围之前,返回值 ( value) 被复制到函数堆栈帧中,在此之后,程序计数器返回到存储在堆栈帧中的位置(从哪里foo调用)。

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


推荐阅读