临时对象的生命周期[重复]

问题描述 投票:0回答:2

下面的代码工作正常,但是为什么这个代码是正确的?为什么 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() );
c++ temporary c++-faq lifetime full-expression
2个回答
66
投票

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

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

51
投票

$12.2/3-“临时对象是 作为最后一步被摧毁 评估完整表达式 (1.9) (词汇上)包含点 他们被创造的地方。这是真实的 即使评估结果是 抛出异常。”

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

编辑2:

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

© www.soinside.com 2019 - 2024. All rights reserved.