【问题标题】:Warning: returning reference to temporary - strange case (Clarification for Rvalue)警告:返回对临时的引用 - 奇怪的情况(澄清右值)
【发布时间】:2017-12-28 13:52:46
【问题描述】:

在这段代码中:

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

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

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

错误:从“int”类型的右值初始化“int&”类型的非常量引用无效

但是在删除 2* (只有 i 留下作为返回值)它没有显示任何错误 -> 我能想到的是这个 2 * 事情是将返回值转换为 Rvalue 但返回值不是 Rvalue 本身吗?我哪里错了?

【问题讨论】:

  • 2*i 导致临时。然后,您返回对该临时文件的引用。轰隆隆!
  • 请注意,即使您保留const,使用返回的值也是未定义的。

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


【解决方案1】:

return 2*i; 不会将 2 乘以 i 并将结果存储到 i。它将2i 相乘,并将结果放入一个临时的。尝试通过引用返回该临时文件是行不通的,因为它在该行的末尾被销毁。终身延长不适用于此处。

如果你想修改 i 并返回它,你需要使用 operator *= 它将修改 i 并给你一个参考,你可以像这样返回

return i *= 2;

但是fun 需要使用int&amp; 而不是const int &amp;


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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多