下面的代码合法吗?
int foo()
{
int local = 5;
int& local_ref = local;
return local_ref;
}
如果是,那么很可能会将local
的值复制到返回值之前销毁local
,但是为什么呢? GCC和MSVC都没有对此抱怨,所以可能是合法的……不是吗?
答案 0 :(得分:0)
有效。 local
和local_ref
都在之前复制了值。另一方面,返回本地引用将调用未定义的行为。通过本地引用,我的意思是int& foo()
,而不是变量local_ref
。
在调用函数之前,将创建堆栈帧(堆栈上用于存储参数,返回值的空间,并在其中保存当前程序计数器)。然后,在函数执行期间,局部变量(local
和local_ref
)被构造在堆栈上。在程序计数器离开功能范围之前,将返回值(value
)复制到函数堆栈框架,并在此之后 ,程序计数器返回到存储在堆栈框架中的位置(从此处开始) foo
被叫来。)
有关更多信息,请搜索堆栈框架。