C++ 返回临时对象并绑定到常量引用

C++ 返回临时对象并绑定到常量引用,c++,reference,constants,C++,Reference,Constants,可能重复: 我的编译器不会抱怨将临时指定给常量引用: string foo() { return string("123"); }; int main() { const string& val = foo(); printf("%s\n", val.c_str()); return 0; } 为什么??我认为从foo返回的字符串是临时的,val可以指向生命周期已经结束的对象。C++标准允许这个并延长返回对象的生命周期吗? 这是C++特性。该代码是有效的,并且完全执

可能重复:

我的编译器不会抱怨将临时指定给常量引用:

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

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

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

这是C++特性。该代码是有效的,并且完全执行它看起来要执行的操作

通常,临时对象仅持续到其出现的完整表达式结束。然而,C++故意指定将临时对象绑定到堆栈上的const的引用,将临时的生存期延长到引用本身的生命期,从而避免否则将是常见的悬空引用错误。在上面的示例中,
foo()
返回的临时值将一直保留到右大括号结束

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


全文:。

是的,只要临时引用是常量引用,它的生存期就会延长。这并不完全是2784262的副本,它(应该)处理引用是类成员的情况。行为是不同的。@Abraud不仅这不是一个重复的问题,这是一个更好的问题,我很高兴我发现了。另外,请注意,由于这里没有对字符串进行复制,因此字符串的复制构造函数必须存在并且可以访问。关于P.S,这一点非常重要,上面链接的dupe SO线程有很好的this@xryl669是否意味着不再需要复制构造函数?quote:``当源对象是临时的```@dashesy时,你是什么意思?在这种情况下,复制构造函数从来都不是“必要的”。实际上,如果
f()
return
表达式返回了一个未命名的rvalue,那么RVO几乎肯定会加入并省略复制构造,而不是直接在调用者的接收位置(变量)构造返回的对象。如果
return
表达式返回一个命名对象,NRVO可能也会这样做。C++17保证的副本省略实现的是在前一种更简单的RVO情况下需要省略。@dashesy Oops,我现在明白了。公平的问题。谢天谢地,答案是微不足道的:那是肯定的。它在逻辑上遵循名称的保证部分。如果保证了复制省略,那么就不需要一个可访问的复制或移动构造函数,因为它保证永远不需要。