使用右值引用延长临时的生命周期

时间:2012-11-27 13:27:41

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

According to another answer,如果引用它的表达式是xvalue表达式,则右值引用不会延长临时值的生命周期。由于std::move返回一个右值引用,因此调用它的表达式是一个xvalue,所以下面会产生一个悬空引用:

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

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

但是我在这里画空白。将xvalue表达式作为参数传递,完全标准地使用std::move和rvalue引用,这有何不同?

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

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

2 个答案:

答案 0 :(得分:8)

你的第二个例子是没有传递对临时的引用,它传递对变量s的引用,该引用一直持续到main()的结尾。

如果是(例如foo(std::move(get_string()));),则临时的生命周期将持续到完整表达式结束 - 函数返回后。因此在foo内使用它是非常安全的。如果foo存储了一个引用/指针到它的参数,那么只有一个危险,而其他东西试图在以后使用它。

答案 1 :(得分:7)

此处无需延长任何生命周期:有问题的对象会持续到main结束,这是foo结束之后。