以下代码工作正常,但为什么这个代码正确?为什么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() );
答案 0 :(得分:64)
当词法中包含rvalue的完整表达式时,将销毁临时对象,该rvalue的评估创建该临时对象已完全评估。让我用ASCII艺术演示:
____________________ full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
^^^^^ ^
| |
birth funeral
答案 1 :(得分:45)
$ 12.2 / 3-“临时物品是 作为最后一步被摧毁 评估全表达式(1.9) 那个(词汇上)包含了这一点 它们的创建地点。这是真的 即使评估结束了 抛出异常。“
foo()返回的临时值的生命周期一直延续到创建它的完整表达式的末尾,即直到函数调用结束“bar”。
编辑2:
$ 1.9 / 12-“一个完整的表达是一个 表达式不是子表达式 另一个表达。如果是一种语言 构造被定义为产生一个 隐式调用函数,使用 考虑语言结构 为了这个目的的表达 这个定义。“