return 引用函数作用域变量作为值是否未定义?
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;
}
如果是,那么它很可能会将 local
的值复制到 return 值 之前 破坏 local
,但为什么呢? GCC 和 MSVC 都没有抱怨这个,所以它可能是合法的......不是吗?
有效。该值被复制 before local
和 local_ref
超出范围。另一方面,returning 本地引用会调用未定义的行为。通过本地引用,我的意思是 int& foo()
,而不是变量 local_ref
。
在调用函数之前,创建堆栈帧(space 在堆栈上用于参数,return 值,作为其中的一部分,当前程序计数器被保存)。然后在函数执行期间,在堆栈上构造局部变量(local
和 local_ref
)。在程序计数器离开函数范围之前,return 值 (value
) 被复制到函数堆栈帧,在此之后 ,程序计数器 returns 到堆栈帧中存储的位置(从调用 foo
的位置)。
有关更多信息,请搜索堆栈框架。
下面的代码合法吗?
int foo()
{
int local = 5;
int& local_ref = local;
return local_ref;
}
如果是,那么它很可能会将 local
的值复制到 return 值 之前 破坏 local
,但为什么呢? GCC 和 MSVC 都没有抱怨这个,所以它可能是合法的......不是吗?
有效。该值被复制 before local
和 local_ref
超出范围。另一方面,returning 本地引用会调用未定义的行为。通过本地引用,我的意思是 int& foo()
,而不是变量 local_ref
。
在调用函数之前,创建堆栈帧(space 在堆栈上用于参数,return 值,作为其中的一部分,当前程序计数器被保存)。然后在函数执行期间,在堆栈上构造局部变量(local
和 local_ref
)。在程序计数器离开函数范围之前,return 值 (value
) 被复制到函数堆栈帧,在此之后 ,程序计数器 returns 到堆栈帧中存储的位置(从调用 foo
的位置)。
有关更多信息,请搜索堆栈框架。