[英]What is the order of destruction of function parameters?
這是對我之前問題的后續跟蹤功能參數的破壞順序是什么? 因為我不小心把參數與參數混淆了 感謝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?
未指定參數銷毀的確切時間點:
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 << "#");
}
用GCC打印10#~0~1
,用Clang打印01#~1~0
; 它們以不同的順序構造參數,但兩者都以相反的構造順序銷毀,在完整表達結束時,調用發生在(而不是在返回調用者之后)。 VC ++打印10~0~1#
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.