考虑以下代码示例:
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])。临时对象是 被破坏是评估全面表达的最后一步 (词汇)包含它们创建的点。这是正确的 即使该评估以抛出异常结束。价值 破坏临时物体的计算和副作用是 仅与全表达相关,不与任何特定 子表达。