破坏功能参数的顺序是什么?

jot*_*tik 17 c++ parameters function object-lifetime language-lawyer

这是对我之前问题的后续跟踪功能参数的破坏顺序是什么?因为我不小心把参数与参数混淆了 感谢Columbo和TC在该问题的评论中清除术语混淆.

如果某些函数的主体f带有参数p_1,...,p_n类型T_1,......,T_n分别抛出异常,完成或返回,参数被破坏的顺序是什么?为什么?如果可能,请提供标准参考.

例子:

template <typename ... Args>
void f(Args ... params) {} // in what order are params destroyed?

void f(T1 p1, T2 p2, T3 p3) {} // in what order are p1, p2 and p3 destroyed?
Run Code Online (Sandbox Code Playgroud)

Col*_*mbo 14

未指定参数销毁的确切时间点:

CWG决定不指定参数对象是在调用之后立即销毁还是在调用所属的完整表达式结束时销毁.

构造参数的顺序也是未指定的,但由于函数参数具有块范围,尽管它们的构造顺序未指定,但是破坏与构造的顺序相反.例如考虑

#include <iostream>

struct A {
    int i;
    A(int i) : i(i) {std::cout << i;}
    ~A() {std::cout << '~' << i;} 
};

void f(A, A) {}

int main() {
    (f(0, 1), std::cout << "#");
}
Run Code Online (Sandbox Code Playgroud)

打印10#~0~1 用GCC01#~1~0 ; 它们以不同的顺序构造参数,但两者都以相反的构造顺序销毁,在完整表达结束时,调用发生在(而不是在返回调用者之后).VC++打印10~0~1#.

  • @Columbo嗯...函数参数的范围包含在[basic.scope.block]中,标准的其他地方清楚地认为它们是自动的(例如,[class.copy]/31-32). (3认同)
  • 为了确保生命永不沉闷,MSVC打印`10~0~1#`(析构函数从`f`中调用). (3认同)
  • 是否要求销毁订单与施工订单相反? (2认同)