延长具有右值引用的临时的生存期

Extension of the lifetime of a temporary with an rvalue reference

本文关键字:生存期 引用      更新时间:2023-10-16

根据另一个答案,如果引用右值引用的表达式是 xvalue 表达式,则不会延长临时引用的生存期。由于 std::move 返回一个右值引用,因此调用它的表达式是一个 xvalue,因此以下内容会导致一个悬空引用:

int main()
{
  std::string&& danger = std::move(get_string());  // dangling reference !
  return 0;
}

没关系。std::move在这里没有意义;它已经是一个右值。

但这就是我画空白的地方。这与将 xvalue 表达式作为参数传递、完全标准地使用std::move和右值引用有何不同?

void foo(const std::string& val);
// More efficient foo for temporaries:
void foo(std::string&& val);
int main()
{
  std::string s;
  foo(std::move(s)); // Give up s for efficiency
  return 0;
}

是否有针对右值引用参数的特殊规则,无论它是 prvalue 还是 xvalue,都可以延长临时参数的生存期?还是调用表达式std::move只是一个 x值,因为我们传递给它的东西已经是一个右值?我不这么认为,因为它无论如何都会返回一个右值引用,这是一个 xvalue。我在这里很困惑。我想我错过了一些愚蠢的东西。

你的第二个例子不是传递对临时的引用,而是传递对变量 s 的引用,该引用一直持续到 main() 年底。

如果是(例如 foo(std::move(get_string())); ),则临时函数的生存期将持续到完整表达式结束 - 在函数返回之后。因此,在 foo 内使用它非常安全。只有当foo存储指向其参数的引用/指针,并且其他东西稍后尝试使用它时,才会有危险。

这里不需要延长任何生命周期:所讨论的对象持续到 main 结束,也就是foo结束之后。