You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:32:22