在下面的代码中:
struct Foo {
void Func();
~Foo();
};
Foo GetFoo(Foo foo);
Run Code Online (Sandbox Code Playgroud)
该函数按值GetFoo接受参数并返回一个对象。如果我们这样调用:fooFooGetFoo
Foo f;
GetFoo(f).Func();
Run Code Online (Sandbox Code Playgroud)
foo根据C++标准,参数或返回值对象会先销毁吗?
C++17 在expr.call#4中表示,实现可以选择是否在函数返回时或在封闭的完整表达式末尾时析构参数对象:
参数的生命周期是在定义参数的函数返回时结束还是在封闭的完整表达式结束时结束,是由实现定义的。
在class.temporary#4中,它还表示临时对象(返回值对象)作为评估完整表达式的最后一步被销毁:
临时对象在评估(词法上)包含它们创建点的完整表达式的最后一步被销毁。
那么,如果实现选择在封闭的完整表达式末尾析构参数对象,根据 C++ 标准,哪个将首先析构?