【问题标题】:Does Lvalue-to-Rvalue conversion occur in function invocation?函数调用中会发生左值到右值的转换吗?
【发布时间】:2020-04-03 02:09:26
【问题描述】:

考虑下面的代码:

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

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

  1. 函数通过 return 语句返回给它的调用者。
  2. [...] return 语句通过 操作数 中的 copy-initialization 初始化(显式或隐式)函数调用的泛左值结果或纯右值结果对象/li>

所以,int result = func(); 的调用,好像可以翻译成:

//a fiction code
func(){
   int a = 0;
   int result = a; #1
}

因为a是一个glvalue,它应该被转换为prvalue进行prvalue评估(初始化一个对象)。所以我的问题是,在func 的主体中调用int result = func(); 时,作为return 的操作数的glvalue a 是否需要转换为prvalue?

【问题讨论】:

  • 询问转换是否发生在词法范围(函数体)中是什么意思?
  • @xskxzr 根据return statement 规则,从return 的操作数复制初始化对象并根据copy-initialize 规则,因此需要将gvalue 转换为prvalue 进行初始化.正如@MM 给出的答案

标签: c++ c++17 language-lawyer


【解决方案1】:

是的 a 在初始化结果对象的过程中经历了左值到右值的转换。 (通俗地说,这意味着检索存储在名为a 的内存位置中的值。

参见 [dcl.init]/17.8:

否则,被初始化对象的初始值是初始化表达式的(可能转换的)值。如有必要,将使用标准转换(第 7 条)将初始化表达式转换为目标类型的 cv 非限定版本;不考虑用户定义的转换。

第 7 条包括左值到右值的转换。

【讨论】:

  • 一个很好的答案。我对 [stmt.return] 有一些其他的困惑,我已经发布了一个新问题,希望你能帮助我理解它们。stackoverflow.com/questions/61004727/…
  • 为什么需要左值到右值的转换?
  • @xskxzr 因为a是glvalue,为了初始化,glvalue需要转换为prvalue,所以lvalue-to-rvalue conversion是必须的。
  • @jackX "为了初始化,glvalue需要转换为prvalue",为什么?
  • @xskxzr 从一个glvalue初始化一个内置类型的对象意味着将glvalue转换为prvalue以获得要存储在正在初始化的对象中的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
相关资源
最近更新 更多