提问人:r5ha 提问时间:7/30/2018 更新时间:7/30/2018 访问量:62
作为值返回对函数范围变量的引用是否未定义?
Is it undefined to return reference to a function-scoped variable as a value?
问:
下面的代码合法吗?
int foo()
{
int local = 5;
int& local_ref = local;
return local_ref;
}
如果是,那么它很可能会在销毁之前将 的值复制到返回值中,但为什么呢?GCC 和 MSVC 都没有抱怨这一点,所以这可能是合法的......不是吗?local
local
答:
0赞
kocica
7/30/2018
#1
它有效。该值在两者之前复制,并且超出范围。另一方面,返回本地引用将调用未定义的行为。通过局部引用,我的意思是,而不是变量。local
local_ref
int& foo()
local_ref
在调用函数之前,将创建堆栈帧(堆栈上用于参数、返回值的空间,并作为其中的一部分,保存当前程序计数器)。然后在函数执行期间,在堆栈上构造局部变量 ( 和 )。在程序计数器离开函数范围之前,返回值 () 被复制到函数堆栈帧中,在此之后,程序计数器返回到存储在堆栈帧中的位置(从调用的位置)。local
local_ref
value
foo
有关详细信息,请搜索堆栈帧。
评论
int& foo()
local_ref
int
int&