考虑以下代码:
#include <iostream>
int func(){
int a = 0;
return a;
}
int main(){
int result = func();
}
根据cpp标准,关于return语句的一些规则是:
- 函数通过return语句返回给调用方
- […]return语句通过从操作数复制初始化来初始化(显式或隐式(函数调用的glvalue结果或prvalue结果对象
因此,对int result = func();
的调用,就好像它可以转换为:
//a fiction code
func(){
int a = 0;
int result = a; #1
}
因为a
是glvalue,所以应该将其转换为prvalue以进行prvalue求值(初始化对象(。所以我的问题是,在调用func
的主体中的int result = func();
时,作为return
的操作数的glvaluea
是否需要转换为prvalue?
Yesa
在初始化结果对象时会进行左值到右值的转换。(非正式地,这意味着存储在名为a
的存储位置中的值被检索(。
参见[dcl.init]/17.8:
否则,正在初始化的对象的初始值是初始值设定项表达式的值(可能已转换(。如有必要,将使用标准转换(第7条(将初始值设定项表达式转换为目标类型的cv不合格版本;不考虑用户定义的转换。
第7条包括左值到右值的转换。