全表达的边界和临时的生命

Vas*_*aka 10 c++ temporary lifetime full-expression

可能重复:
C++:临时参数的生命周期?

据说临时变量作为评估完整表达式的最后一步被破坏,例如

bar( foo().c_str() );
Run Code Online (Sandbox Code Playgroud)

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

baz( bar( foo().c_str() ) );
Run Code Online (Sandbox Code Playgroud)

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

sbi*_*sbi 11

临时生活直到它们被创造的完整表达结束."完整表达式"是不是另一个表达式的子表达式的表达式.

baz(bar(...));,bar(...)是一个子表达式baz(...),而baz(...)不是任何子表达式.因此,baz(...)是完整表达式,并且在baz(...)返回之前不会删除在评估此表达式期间创建的所有临时表达式.

  • 但请注意,构造函数是一个特殊情况(我认为 - 90%肯定),所以在`baz(X(foo().c_str()));`,其中`X`是一个类和参数`baz`是对`X`构造函数的调用,`c_string`的生命周期将在构造函数退出时结束. (2认同)