c++ - 返回类型为引用时的规则是什么
问题描述
#include <iostream>
int func0(){
int a = 0;
return a;
}
int&& func1(){
int a = 0;
return a;
}
int main(){
int&& result0 = func0();
int&& result1 = func1();
}
return statement
规则是:
- 函数通过 return 语句返回给它的调用者。
- [...] return 语句通过操作数的复制初始化来初始化(显式或隐式)函数调用的glvalue 结果或 prvalue 结果对象。
关于如何初始化函数调用的对象的规则只有#2。
我们知道表达式func0()
是纯右值。引用result0
需要绑定一个对象,所以temporary materialization conversion
要把prvalue转换成一个xvalue,所以临时对象作为prvalue结果对象从 的操作数初始化return
,然后引用reusult0
绑定到临时对象。
但是我们知道result1
是一个引用并且返回类型func1
也是引用。对于这种情况,[stmt.return]并没有明确涵盖这种情况,因为result1
是引用而不是object
(既不是 glvalue reuslt 对象也不是 prvalue 结果对象),那么这种情况的规则是什么?如果我错过了什么,请纠正我。
解决方案
你的分析result0
是正确的。
但本案没有临时实现result1
。“glvalue 结果”是通过从操作数a
复制初始化来初始化的引用,并且对相同类型的引用的复制初始化意味着引用直接绑定(dcl.init.ref/5,通过 dcl.init/17.2) . 然后result1
绑定到 glvalue 结果。
这会创建一个悬空引用;声明return
从生命周期扩展规则中明确排除(class.temporary/6.2)。
在这种情况下int result2 = func1();
,glvalue 结果(引用)使用 result object 进行左值到右值的转换result2
,这会导致未定义的行为,因为 glvalue 结果是悬空的。
推荐阅读
- react-native - 如何在抽屉导航屏幕中传递参数?
- nginx - 有关 Nginx 如何在 Google 计算引擎上使用 SSL 的详细信息
- r - R中混合lmer模型的警告消息
- react-native - react-native-admob:compileDebugJavaWithJavac 失败
- python - 如何配置 Python 并组织我的解释器?
- docker - 从 Liferay 7.3 中的角色删除权限
- video - 使用 ffmpeg 进行动态转码和 HLS 流式传输
- javascript - 这个反应代码中的错误是什么?当我在第 1 部分中调用该函数时,它不起作用,但第 2 部分有效
- generics - Kotlin:在函数中传递用于 filterIsInstance 的类类型
- python - 使用 fipy 跨域耦合 pdes