2011-03-28 28 views
10

可能重复:
C++: Life span of temporary arguments?全表达边界和临时对象的寿命

据说临时变量被破坏作为评价全表达的最后一个步骤,例如

bar(foo().c_str()); 

临时指针生活,直到酒吧回报,但什么的

baz(bar(foo().c_str())); 

是它仍然生活,直到酒吧的回报,或巴兹回到这里指充分表达年底, 编译器我查销毁对象后巴兹回来了,但我可以依靠吗?

+0

是的,这个问题的答案应该是http://stackoverflow.com/questions/4214153/lifetime-of-temporaries的一部分,我问了一个新的问题,因为我没有权利发表评论,我是对这里没有涉及的具体细节感兴趣。 – Vasaka 2011-03-29 19:51:55

回答

10

临时生活直到创建它们的完整表达式的末尾。 “完整表达式”是不是另一个表达式的子表达式的表达式。

baz(bar(...));,bar(...)baz(...)的子表达式,而baz(...)不是任何东西的子表达式。因此,baz(...)是完整表达式,并且在评估此表达式期间创建的所有临时对象将不会被删除,直到返回baz(...)之后。

+2

但是请注意,构造函数是一个特殊情况(我认为 - 90%肯定),所以在'baz(X(foo()。c_str()));'中,其中'X'是一个类和参数到'baz'是对'X'的构造函数的调用,'c_string'的生命期将在构造函数退出时结束。 – 2013-03-17 18:09:13

3

顾名思义,全部表达式就是所有表达式,包括对baz()的调用,所以临时会持续到调用baz()返回。