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

时间:2017-07-22 14:49:04

标签: c++ reference return-value rvalue temporary

在此代码中:

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&amp;'类型的非const引用

但是在删除 2 * (仅返回 i 左侧)时,它不会显示任何错误 - &gt;我能想到的是这个 2 * 的事情是将回报转换为 Rvalue ,但是后来不是返回值 Rvalue 本身?我哪里错了?

1 个答案:

答案 0 :(得分:5)

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;
}