考虑下面的代码:
#include <iostream>
int func(){
int a = 0;
return a;
}
int main(){
int result = func();
}
根据cpp标准,关于return语句的一些规则是:
- 函数通过 return 语句返回到其调用者。
- [...] return 语句初始化(显式或隐式)函数调用的泛左值结果或纯右值结果对象复制初始化来自operand
因此,调用int result = func();
,就好像它可以翻译成:
//a fiction code
func(){
int a = 0;
int result = a; #1
}
Because a
是一个泛左值,应该将其转换为纯右值以进行纯右值评估(初始化对象)。所以我的问题是,在调用时int result = func();
在体内func
,左值a
作为操作数return
,需要转换为纯右值吗?
Yes a
作为初始化结果对象的一部分,进行左值到右值的转换。 (通俗地说,这意味着存储在名为a
被检索)。
参见[dcl.init]/17.8:
否则,正在初始化的对象的初始值是初始化表达式的(可能已转换)值。如有必要,将使用标准转换(第 7 条)将初始值设定项表达式转换为目标类型的 cv 未限定版本;不考虑用户定义的转换。
第 7 条包括左值到右值的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)