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

Gau*_*rav 1 c++ reference temporary return-value rvalue

在这段代码中:

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

int main()
{
    const int k=3;
    cout<<fun(k)<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

错误:从'int'类型的右值开始,无效初始化'int&'类型的非const引用

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

Nat*_*ica 5

return 2*i;不乘2i和储存导致成i.它2乘以i并将结果放入临时值.试图通过引用返回临时值是不行,因为它在该行的末尾被销毁.终身延期不适用于此处.

如果你想修改i并返回它,你需要使用operator *=哪个将修改i并给你一个你可以返回的引用

return i *= 2;
Run Code Online (Sandbox Code Playgroud)

fun需要采取一个int&而不是const int &.


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

int fun(const int &i)
{
    return 2*i;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以抓住它:

int main()
{
    const int& ret = fun(3);
    cout << ret << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)