为了账号安全,请及时绑定邮箱和手机立即绑定

返回临时对象并绑定到const引用

返回临时对象并绑定到const引用

C++
GCT1015 2019-12-26 13:59:54
我的编译器没有抱怨将const引用分配给临时引用:string foo() {  return string("123");};int main() {  const string& val = foo();  printf("%s\n", val.c_str());  return 0;}为什么?我以为从返回的字符串foo是临时的,而val可以指向生命周期已结束的对象。C ++标准是否允许这样做并延长返回对象的寿命?
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

这是C ++功能。该代码是有效的,并且完全按照它的意图执行。

通常,临时对象仅持续到其出现的完整表达式的结尾。但是,C ++故意指定将临时对象绑定到堆栈上const的引用将引用的寿命延长到引用本身的寿命,从而避免了否则会导致常见的悬挂引用错误。在上面的示例中,临时属性由foo()生命返回,直到大括号闭合为止。

PS:这仅适用于基于堆栈的引用。对于属于对象成员的引用不起作用。


查看完整回答
反对 回复 2019-12-26
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

是什么意思?在这种情况下,复制构造函数从来不是 “必需的”。实际上,如果返回的return表达式f()返回未命名的rvalue,则RVO几乎肯定会加入进来并消除了副本构造,而是直接在调用者的接收位置(变量)构造返回的对象。如果return表达式返回了一个命名对象,NRVO可能会做同样的事情。什么C ++ 17的保证复制省略实现是需要省音在RVO前,简单的情况。

查看完整回答
反对 回复 2019-12-26
  • 2 回答
  • 0 关注
  • 618 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信