Lvalue到Rvalue的转换是否发生在函数调用中



考虑以下代码:

#include <iostream>
int func(){
int a = 0;
return a;
}
int main(){
int result = func();
}

根据cpp标准,关于return语句的一些规则是:

  1. 函数通过return语句返回给调用方
  2. […]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条包括左值到右值的转换。

最新更新