c++ - 将函数范围变量的引用作为值返回是否未定义?
问题描述
下面的代码合法吗?
int foo()
{
int local = 5;
int& local_ref = local;
return local_ref;
}
如果是,那么很可能会在销毁之前local
将值复制到返回值,但为什么呢?GCC 和 MSVC 都没有抱怨这一点,所以它可能是合法的......不是吗?local
解决方案
它有效。该值在两者之前local
被复制并local_ref
超出范围。另一方面,返回本地引用会调用未定义的行为。我的意思是本地引用,int& foo()
而不是变量local_ref
。
在调用函数之前,会创建堆栈帧(堆栈空间用于参数、返回值以及作为其中一部分的当前程序计数器被保存)。然后在函数执行期间,在堆栈上构造局部变量 (local
和)。local_ref
在程序计数器离开函数范围之前,返回值 ( value
) 被复制到函数堆栈帧中,在此之后,程序计数器返回到存储在堆栈帧中的位置(从哪里foo
调用)。
有关更多信息,请搜索堆栈帧。
推荐阅读
- java - 将休息后请求映射到对象
- javascript - 为什么我收到一条错误消息“TypeError:无法读取未定义的属性‘执行’”
- nativescript-vue - 如何在 Vuex 操作中使用手动路由?
- javascript - 尝试本地数据存储时输入错误,如何启动我的网站?
- python - 当参数是列表时,“函数”对象不可下标
- c# - 错误 CS0103:当前上下文中不存在名称“NNN”
- python - 如何在 Python 中更改最低有效位
- java - java.naming 到 spring.ldap.core 的模块导出错误,即使在 pom 中使用 add-export 命令?
- c++ - QComboBox选择后如何打开对话框
- r - 来自石灰包的带有 plot_features 的闪亮 plotOutput 什么也没产生