9

根据另一个答案,如果引用它的表达式是 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;
}

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

4

2 回答 2

8

您的第二个示例不是传递对临时的引用,而是传递对变量的引用,该变量s一直持续到main().

如果是(例如foo(std::move(get_string()));),那么临时的生命周期将持续到完整表达式的结尾——在函数返回之后。因此在foo. 如果foo存储指向其参数的引用/指针,并且稍后尝试使用它,则只有危险。

于 2012-11-27T13:33:38.377 回答
7

这里不需要延长任何生命周期:有问题的对象会持续到 结束main,也就是 结束之后foo

于 2012-11-27T13:31:03.417 回答