37

以下代码工作正常,但为什么这是正确的代码?为什么 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() );
4

2 回答 2

67

当完全评估词法上包含其评估创建该临时对象的右值的完整表达式时,临时对象将被销毁。让我用 ASCII 艺术来演示一下:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
于 2010-11-18T11:21:55.233 回答
50

$12.2/3-“临时对象在评估完整表达式 (1.9) 的最后一步时被销毁,该完整表达式 (1.9) 包含创建它们的点。即使评估以抛出异常结束也是如此。”

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

编辑2:

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

于 2010-11-18T11:20:17.487 回答