临时的一生

时间:2010-11-18 11:16:49

标签: c++ temporary c++-faq lifetime full-expression

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

2 个答案:

答案 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-“一个完整的表达是一个   表达式不是子表达式   另一个表达。如果是一种语言   构造被定义为产生一个   隐式调用函数,使用   考虑语言结构   为了这个目的的表达   这个定义。“