正在返回临时对象并绑定到常量引用

Returning temporary object and binding to const reference

本文关键字:常量 引用 绑定 返回 临时对象      更新时间:2023-10-16

可能重复:
const引用会延长临时引用的寿命吗?

我的编译器不会抱怨为常量引用分配临时引用:

string foo() {
  return string("123");
};
int main() {
  const string& val = foo();
  printf("%sn", val.c_str());
  return 0;
}

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

这是一个C++特性。该代码是有效的,并且完全按照它看起来的方式执行。

通常,临时对象只会持续到它出现的完整表达式结束。然而,C++故意指定将临时对象绑定到堆栈上const的引用会将临时对象的生存期延长到引用本身的生存期,从而避免了常见的悬挂引用错误。在上面的例子中,foo()返回的临时值一直存在到最后一个大括号。

附言:这只适用于基于堆栈的引用。它不适用于作为对象成员的引用。

全文:GotW#88:Herb Sutter的"最重要常数"候选人。