据说临时变量被破坏作为评价全表达的最后一个步骤,例如
bar(foo().c_str());
临时指针生活,直到酒吧回报,但什么的
baz(bar(foo().c_str()));
是它仍然生活,直到酒吧的回报,或巴兹回到这里指充分表达年底, 编译器我查销毁对象后巴兹回来了,但我可以依靠吗?
据说临时变量被破坏作为评价全表达的最后一个步骤,例如
bar(foo().c_str());
临时指针生活,直到酒吧回报,但什么的
baz(bar(foo().c_str()));
是它仍然生活,直到酒吧的回报,或巴兹回到这里指充分表达年底, 编译器我查销毁对象后巴兹回来了,但我可以依靠吗?
临时生活直到创建它们的完整表达式的末尾。 “完整表达式”是不是另一个表达式的子表达式的表达式。
baz(bar(...));
,bar(...)
是baz(...)
的子表达式,而baz(...)
不是任何东西的子表达式。因此,baz(...)
是完整表达式,并且在评估此表达式期间创建的所有临时对象将不会被删除,直到返回baz(...)
之后。
但是请注意,构造函数是一个特殊情况(我认为 - 90%肯定),所以在'baz(X(foo()。c_str()));'中,其中'X'是一个类和参数到'baz'是对'X'的构造函数的调用,'c_string'的生命期将在构造函数退出时结束。 – 2013-03-17 18:09:13
顾名思义,全部表达式就是所有表达式,包括对baz()
的调用,所以临时会持续到调用baz()
返回。
是的,这个问题的答案应该是http://stackoverflow.com/questions/4214153/lifetime-of-temporaries的一部分,我问了一个新的问题,因为我没有权利发表评论,我是对这里没有涉及的具体细节感兴趣。 – Vasaka 2011-03-29 19:51:55