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

时间:2016-05-02 22:23:30

标签: c++ function parameters language-lawyer object-lifetime

这是我之前的问题What is the order of destruction of function arguments?的后续行动,因为我不小心将参数与参数混淆了。感谢Columbo和T.C.在该问题的评论中清除术语混淆。

如果某个函数def setUpClass(cls): pass 的主体分别带有参数hashcode % 20,...,f类型p_1,...,p_n异常,完成或返回,参数以什么顺序销毁,为什么?如果可能,请提供标准参考。

示例:

T_1

1 个答案:

答案 0 :(得分:14)

参数被销毁的确切时间点是unspecified

  

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 << "#");
}

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