2012-07-19 33 views
53

可能重复:
Does a const reference prolong the life of a temporary?返回临时对象,并结合const引用

我的编译器不抱怨为const参考分配临时:

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

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

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

+4

是的,只要是** const **参考,临时的生命周期就会延长。 – chris 2012-07-19 11:56:47

+2

这不完全是2784262的副本,它应该处理引用是类成员的情况。行为是不同的。 – aberaud 2014-11-29 20:54:55

+1

@aberaud不仅这不是重复的,这是一个更好的问题,我很高兴我找到了。 – dashesy 2016-07-01 14:30:51

回答

66

这是一个C++特性。该代码是有效的,并且看起来确实如此。

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

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

全文:GotW #88: A Candidate For the “Most Important const” by Herb Sutter

+2

此外,请注意,通过在此处对字符串不做任何复制,字符串的复制构造函数必须存在并且可以访问。 – xryl669 2013-11-25 16:53:12

+0

重新** ** PS **,这是非常重要的,和上面链接的重复SO线程有这个好插图 – 2016-03-06 02:27:10

+0

@ xryl669是否[C++ 17保证副本elision](http://www.open-std。 org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html)是否意味着复制构造函数不再需要?引用:''当源对象是临时''' – dashesy 2016-07-01 15:09:50