【问题标题】:std::move and static_cast<T&&> different results [duplicate]std::move 和 static_cast<T&&> 不同的结果[重复]
【发布时间】:2013-10-30 20:11:18
【问题描述】:

哦,我在右值引用理解中发现了一个问题。 问题:

int&& foo()
{
    int n = 5;
    return std::move(n);
}

int bar()
{
    int y = 10;
    return y;
}

int main()
{
    int&& p = foo();
    bar();
    std::cout << p;
}

编译器不会写出我们从函数 foo 返回本地地址的错误或警告。我将在功能栏中将值 5 替换为 10。但结果是 5。 如果我将 std::move 更改为 static_cast 编译器会出错,结果为 10。为什么会这样?我使用 gcc 4.8.1。

【问题讨论】:

  • 问题略有不同,但答案与Is returning by rvalue reference more efficient?相同
  • 您似乎在使用右值引用,因为它们是某种神奇的东西。他们不是。它们是参考。不要返回对函数本地事物的引用。他们会晃来晃去。另外,避免不必要的std::move 电话。如果你返回一个函数本地的东西,你不需要std::move。事实上,在这种情况下使用 std::move 可能会损害性能,因为它有效地禁用了返回值优化。

标签: c++ c++11 move-semantics rvalue-reference


【解决方案1】:

返回对局部变量的引用是未定义的行为。什么事情都可能发生。不要这样做。

【讨论】:

  • @H2CO3,const 无助于堆栈展开,是吗?
  • @user2834162:错误在于这一行:int&amp;&amp; foo()
  • @JohanLundberg:您能否删除您对 H2CO3 的过时响应? :-)
  • (EDIT) 为了使答案更有用,让我补充一点,在这种情况下,应该依赖第二个版本的“返回值优化”而不是(错误地)创建第一个的悬空引用版本。
猜你喜欢
  • 2021-09-07
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2019-04-14
  • 2022-10-27
  • 1970-01-01
相关资源
最近更新 更多