函数参数和返回值的销毁顺序是什么?

Tim*_*Liu 9 c++ language-lawyer

在下面的代码中:

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++ 标准,哪个将首先析构?

kwi*_*ikc -5

我认为答案取决于编译器如何实现该标准。答案并不重要。从编码的角度来看,函数参数不存在于函数之外。换句话说,除了函数调用之外,函数参数与外围表达式无关。

[添加]我不明白为什么这个答案会得到反对票。从帖子引用的链接来看,标准明确指出函数参数的销毁时间由实现决定。并且该标准不涉及函数参数和临时对象之间的顺序问题。

  • 该问题被标记为“语言律师”,这意味着它具体询问标准的内容,而不考虑实际相关性(并且在某些特殊情况下可能相关)。“_取决于编译器如何实现标准_”似乎暗示排序是_实现定义的_或_不确定_,但这需要参考标准进行争论。 (4认同)