临时人员的一生

临时人员的一生

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


ITMISS
浏览 287回答 2
2回答

MYYA

$12.2/3-“临时对象被销毁,作为评估完整表达式(1.9)的最后一步,这个表达式(在词汇上)包含创建它们的点,即使该评估以抛出异常结束也是如此。”foo()返回的临时表达式的生存期将一直延长到创建完整表达式的末尾,即函数调用‘bar’的末尾。编辑2:$1.9/12-“一个完整表达式不是另一个表达式的子表达式,如果一个语言结构被定义为产生一个函数的隐式调用,那么就这个定义而言,语言结构的使用被认为是一个表达式。”

扬帆大鱼

当在词汇上包含其计算结果所创建的临时对象的rvalue的完整表达式被完全计算时,临时对象将被销毁。让我用ASCII的艺术来演示:____________________   full-expression ranges from 'b' to last ')'bar( foo().c_str() );     ^^^^^          ^       |            |     birth       funeral
打开App,查看更多内容
随时随地看视频慕课网APP