猿问

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

我的编译器没有抱怨将const引用分配给临时引用:


string foo() {

  return string("123");

};


int main() {

  const string& val = foo();

  printf("%s\n", val.c_str());

  return 0;

}

为什么?我以为从返回的字符串foo是临时的,而val可以指向生命周期已结束的对象。C ++标准是否允许这样做并延长返回对象的寿命?


GCT1015
浏览 619回答 2
2回答

米琪卡哇伊

这是C ++功能。该代码是有效的,并且完全按照它的意图执行。通常,临时对象仅持续到其出现的完整表达式的结尾。但是,C ++故意指定将临时对象绑定到堆栈上const的引用将引用的寿命延长到引用本身的寿命,从而避免了否则会导致常见的悬挂引用错误。在上面的示例中,临时属性由foo()生命返回,直到大括号闭合为止。PS:这仅适用于基于堆栈的引用。对于属于对象成员的引用不起作用。

泛舟湖上清波郎朗

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