临时的一生

Fru*_*nsi 37 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() );
Run Code Online (Sandbox Code Playgroud)

fre*_*low 64

当词汇包含rvalue的完整表达式时,将销毁临时对象,该rvalue的评估创建了对临时对象的完全评估.让我用ASCII艺术演示:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
Run Code Online (Sandbox Code Playgroud)

  • ASCII艺术中的隐喻插图:)非常具有说明性.我真的很喜欢他们 (9认同)

Chu*_*dad 45

$ 12.2/3-"作为评估全表达式(1.9)的最后一步,(词法上)包含创建它们的点,临时对象被销毁.即使该评估以抛出异常结束,也是如此."

foo()返回的临时值的生命周期一直延续到创建它的完整表达式的末尾,即直到函数调用"bar"结束.

编辑2:

$ 1.9/12-"完整表达式是一个表达式,它不是另一个表达式的子表达式.如果定义了一个语言结构来产生一个函数的隐式调用,那么语言结构的使用被认为是一个表达式.这个定义的目的."

  • `c_str()`根本不返回临时值.它返回指针类型的右值.指针类型的Rvalues不是对象.他们没有一生. (4认同)