首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用右值引用的临时值的生命周期的延长

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

Stack Overflow用户
提问于 2012-11-27 21:27:41
回答 2查看 2.2K关注 0票数 9

According to another answer时,如果引用临时值的表达式是x值表达式,则右值引用不会延长临时值的生存期。因为std::move返回一个右值引用,所以调用它的表达式是一个x值,所以下面的结果是一个悬空引用:

代码语言:javascript
运行
复制
int main()
{
  std::string&& danger = std::move(get_string());  // dangling reference !
  return 0;
}

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

但这是我一片空白的地方。这与将xvalue表达式作为参数传递有什么不同,完全是std::move和rvalue引用的标准用法?

代码语言:javascript
运行
复制
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值,因为我们传递给它的东西已经是一个右值?我不这么认为,因为它会返回一个右值引用,这是一个x值。我对此感到困惑。我想我漏掉了一些愚蠢的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-27 21:31:03

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

票数 7
EN

Stack Overflow用户

发布于 2012-11-27 21:33:38

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

如果是(例如foo(std::move(get_string()));),则临时表达式的生命周期将持续到完整表达式的末尾-在函数返回之后。因此,在foo中使用它是非常安全的。只有当foo存储了指向其参数的引用/指针,然后其他对象试图使用它时,才会有危险。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13585285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档