警告:返回对临时 - 奇怪情况的引用(对 Rvalue 的澄清)

Warning: returning reference to temporary - strange case (Clarification for Rvalue)

本文关键字:引用 Rvalue 情况 返回 警告      更新时间:2023-10-16

在这段代码中:

const int & fun(const int &i)
{
return 2*i;
}
int main()
{
const int k=3;
cout<<fun(k)<<endl;
return 0;
}

在这种情况下,fun的参数不是本地的(没有临时对象来存储引用返回类型(,那么为什么会出现这个警告?+如果我从函数乐趣的返回类型中删除const,它说

错误:从类型为"int

"的右值初始化类型为"int&"的非 const 引用无效

但是在删除2* 时(只有我保留为返回的值(,它没有显示任何错误 ->能想到的是这个2*的东西是将返回转换为 Rvalue,但返回值本身不是Rvalue吗?我哪里出错了?

return 2*i;不会将2乘以i并将结果存储到i中。 它将2乘以i,并将该结果置于临时状态。 试图通过引用返回临时是不行的,因为它在该行的末尾被破坏。 延长寿命在这里不适用。

如果要修改i并返回它,则需要使用operator *=它将修改i并为您提供对它的引用,您可以像

return i *= 2;

但是fun需要采取int&而不是const int &


如果你想返回一个右值,那么你要做的就是按值返回,如下所示:

int fun(const int &i)
{
return 2*i;
}

现在您可以像这样捕获它:

int main()
{
const int& ret = fun(3);
cout << ret << endl;
return 0;
}