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

Is it undefined to return reference to a function-scoped variable as a value?

提问人:r5ha 提问时间:7/30/2018 更新时间:7/30/2018 访问量:62

问:

下面的代码合法吗?

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

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

C++ 引用 按值传递

评论

4赞 kocica 7/30/2018
这是正确的。该值将被复制。另一方面,返回本地引用将调用未定义的行为。通过局部引用,我的意思是,而不是变量。int& foo()local_ref
0赞 Adrian W 7/30/2018
您的函数返回 ,而不是 ,因此您没有返回引用。因此,您需要重新表述您的问题,例如返回函数范围变量的副本是否未定义,然后您会立即看到这并不是一个真正的问题。intint&

答:

0赞 kocica 7/30/2018 #1

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


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

有关详细信息,请搜索堆栈帧。