gpt4 book ai didi

c++ - 当返回类型是引用时有什么规则

转载 作者:行者123 更新时间:2023-12-01 15:10:47 24 4
gpt4 key购买 nike

#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 语句规则是:

  1. A function returns to its caller by the return statement.
  2. [...] the return statement initializes the glvalue result or prvalue result object of the (explicit or implicit) function call by copy-initialization from the operand.

关于如何初始化函数调用对象的规则只有#2。

我们知道表达式 func0() 是一个纯右值。引用result0需要绑定(bind)一个对象,所以temporary materialization conversion会将纯右值转换成一个xvalue,所以作为prvalue结果对象的临时对象是从操作数初始化的return,然后引用 reusult0 绑定(bind)到临时对象。

但是我们知道result1是一个引用,func1的返回类型也是引用。对于这种情况,[stmt.return] 没有明确涵盖这种情况,因为 result1 是一个引用而不是 object(glvalue reuslt object 都不是也不是纯右值结果对象),那么这种情况的规则是什么?如果我遗漏了什么,请纠正我。

最佳答案

您对result0 的分析是正确的。

但是在 result1 的情况下没有临时物化。 “glvalue result”是从操作数a复制初始化的引用,复制初始化相同类型的引用意味着引用直接绑定(bind)(dcl.init.ref/5 ,通过 dcl.init/17.2)。然后 result1 绑定(bind)到 glvalue 结果。

这会创建一个悬空引用; return 语句被明确排除在生命周期延长规则之外(class.temporary/6.2)。

int result2 = func1(); 的情况下,glvalue 结果(一个引用)与结果对象 result2 进行左值到右值的转换,这导致未定义自 glvalue 结果悬空以来的行为。

关于c++ - 当返回类型是引用时有什么规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61004727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com