临时工的生命周期

下面的代码工作正常,但为什么这是正确的代码? 为什么foo()返回的临时的“c_str()”指针有效? 我想,当进入bar()时,这个临时文件已经被破坏 – 但是它似乎不是这样的。 所以,现在我假设由foo()返回的临时文件在调用bar()之后会被销毁 – 这是正确的吗? 为什么?

std::string foo() { std::string out = something...; return out; } void bar( const char* ccp ) { // do something with the string.. } bar( foo().c_str() ); 

$ 12.2 / 3-“临时对象被作为评估完整expression式(1.9)的最后一步被破坏,即(词法上)包含它们被创build的点,即使评估结束于抛出exception也是如此。

由foo()返回的临时生命周期一直延伸到创build它的完整expression式的末尾,即直到函数调用“bar”结束。

编辑2:

$ 1.9 / 12-“一个完整expression式不是另一个expression式的子expression式,如果一个语言结构被定义为产生一个函数的隐式调用,则该语言结构的使用被认为是这个定义的目的“。

当词法上包含评估创build的临时对象被完全评估的右值的完整expression式时,临时对象被销毁。 让我用ASCII艺术来演示:

 ____________________ full-expression ranges from 'b' to last ')' bar( foo().c_str() ); ^^^^^ ^ | | birth funeral