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

gru*_*czy 61 c++ const reference

可能重复:
const引用是否延长了临时的寿命?

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

string foo() {
  return string("123");
};

int main() {
  const string& val = foo();
  printf("%s\n", val.c_str());
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Ser*_* K. 71

这是一个C++功能.代码是有效的,并且完全符合它的样子.

通常,临时对象仅持续到它出现的完整表达式的结尾.但是,C++故意指定将临时对象绑定到堆栈上对const的引用会延长临时对象生命周期的生命周期,从而避免了常见的悬空引用错误.在上面的例子中,临时返回的foo()生命直到结束大括号.

PS:这仅适用于基于堆栈的引用.它不适用于作为对象成员的引用.

全文:GotW#88:Herb Sutter的"最重要的const"的候选人.

  • 此外,请注意,通过此处的字符串不复制,字符串的复制构造函数必须存在且可访问. (2认同)