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