完整表达边界和临时变量的生命周期[重复]

问题描述 投票:0回答:2

可能重复:
临时函数参数的生命周期是多长?
临时对象什么时候销毁?

据说临时变量在评估完整表达式的最后一步被销毁,例如

bar( foo().c_str() );

临时指针一直存在,直到 bar 返回,但是

有什么用?
baz( bar( foo().c_str() ) );

它是否仍然存在,直到 bar 返回,或者 baz 返回意味着完整表达式在这里结束, 我检查了编译器在 baz 返回后析构对象,但我可以依赖它吗?

c++ temporary lifetime full-expression
2个回答
17
投票

临时对象一直存在到创建它们的完整表达式结束为止。 “完整表达式”是一个不是另一个表达式的子表达式的表达式。

baz(bar(...));
中,
bar(...)
baz(...)
的子表达式,而
baz(...)
不是任何内容的子表达式。因此,
baz(...)
是完整的表达式,并且在计算该表达式期间创建的所有临时变量直到
baz(...)
返回后才会被删除。


3
投票

顾名思义,完整表达式是所有表达式,包括对

baz()
的调用,因此临时表达式将一直存在,直到对
baz()
的调用返回。

© www.soinside.com 2019 - 2024. All rights reserved.