C++标准中函数参数与返回值临时对象的销毁顺序疑问
参数对象与返回值临时对象的销毁顺序问题
先看这段C++代码:
struct Foo { void Func(); ~Foo(); }; Foo GetFoo(Foo foo);
函数GetFoo按值接收参数foo,并返回一个Foo对象。当以如下方式调用时:
Foo f; GetFoo(f).Func();
问题是:根据C++标准,参数foo和返回值对象谁会先被销毁?
相关C++17标准条款
expr.call#4条款:参数对象的生命周期是在其所属函数返回时结束,还是在封闭完整表达式结束时结束,这是实现定义的。
class.temporary#4条款:临时对象(即这里的返回值对象)会作为求值包含其创建点的完整表达式的最后一步被销毁。
当实现选择在完整表达式结束时销毁参数对象的情况
如果实现选择让参数对象在封闭完整表达式结束时销毁,那么参数对象会先于返回值临时对象被销毁。
原因在于:同一完整表达式中创建的临时对象(参数对象本质也是临时对象,是函数调用时复制实参得到的),销毁顺序与它们的创建顺序相反。这里参数对象的创建早于返回值临时对象,因此销毁时参数对象先被销毁,随后才是返回值临时对象,而返回值临时对象的销毁是整个完整表达式求值的最后一步。
内容的提问来源于stack exchange,提问作者Timothy Liu
相关产品推荐
相关产品推荐

