【发布时间】:2020-04-03 03:35:54
【问题描述】:
#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() 是prvalue。引用result0需要绑定一个对象,所以temporary materialization conversion要把prvalue转换成xvalue,所以临时对象作为prvalue结果对象是从return的操作数初始化的,然后引用reusult0绑定到临时对象。
但我们知道result1 是引用,func1 的返回类型也是引用。对于这种情况,[stmt.return]并没有明确涵盖这种情况,因为result1是引用而不是object(既不是glvalue reuslt对象也不是prvalue结果对象),那么规则是什么关于这个案子?如果我遗漏了什么,请纠正我。
【问题讨论】:
-
为什么要单独问这个?考虑到您的问题围绕退货声明规则,您可以将这个疑问添加到之前的 question。
-
@Anirban166 不同意 - 该网站使用“每个问题 1 个问题”格式。这个关于通过引用返回的问题与其他问题有很大不同
-
@Anirban166 我认为它们是不同的问题。所以我打开一个新帖子
标签: c++ return c++17 language-lawyer