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
用GCC和01#~1~0
与锵 ; 它们以不同的顺序构造参数,但两者都以相反的构造顺序销毁,在完整表达结束时,调用发生在(而不是在返回调用者之后).VC++打印10~0~1#
.