临时工的生命周期
下面的代码工作正常,但为什么这是正确的代码? 为什么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-“临时对象作为评估完整表达式(1.9)的最后一步被破坏,即(词法上)包含它们创建的点,即使评估以抛出异常结束也是如此。
由foo()返回的临时的生命周期一直延伸到创建它的完整表达式的末尾,即直到函数调用“bar”结束。
编辑2:
$ 1.9 / 12-“一个完整表达式不是另一个表达式的子表达式,如果一个语言结构被定义为产生一个函数的隐式调用,则该语言结构的使用被认为是这个定义的目的。“
当词法上包含评估创建的临时对象被完全评估的右值的完整表达式时,临时对象被销毁。 让我用ASCII艺术来演示:
____________________ full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
^^^^^ ^
| |
birth funeral
链接地址: http://www.djcxy.com/p/20967.html