Callee返回对象的范围W.R.T.呼叫者本地变量



考虑以下代码示例:

SomeClass Callee() {
  // Option 1:
  return SomeClass(/* initializer here */);
  // Option 2:
  SomeClass tmp(/* initializer here */);
  // Do something to tmp here
  return tmp;
}
void Caller() {
 SomeClass a(/* initializer here */);
 SomeClass b = Callee();
 SomeClass c(/* initializer here */);
}

afaik,b在上面的示例中的寿命将比c更长,但不长于a

但是,如果Callee()的返回值未分配给Caller()中的任何变量,会发生什么?返回的对象在上面的示例中会像b一样行事?还是在创建c之前会破坏它?我想这是后者,只想确定。

代码示例是:

void Caller() {
 SomeClass a(/* initializer here */);
 Callee(); // what is the scope for the object returned by it?
 SomeClass c(/* initializer here */);
}

是的,它甚至在创建c之前就会被破坏,因为它是临时的。寿命是涉及函数调用的完整表达式。

[class.temporary]/4:

实现引入一个类的临时对象时 具有一个非平凡的构造函数([class.ctor],[class.copy]),它应 确保将构造函数称为临时对象。 同样,应要求攻击者临时 非平凡的破坏者([class.dtor])。临时对象是 被破坏是评估全面表达的最后一步 (词汇)包含它们创建的点。这是正确的 即使该评估以抛出异常结束。价值 破坏临时物体的计算和副作用是 仅与全表达相关,不与任何特定 子表达。

最新更新