2016-05-02 21 views
17

Đây là câu hỏi tiếp theo cho câu hỏi trước của tôi What is the order of destruction of function arguments? vì tôi vô tình nhầm lẫn các đối số với các tham số. Nhờ Columbo và T.C. để giải thích cho tôi về sự nhầm lẫn về thuật ngữ trong các ý kiến ​​của câu hỏi đó.Thứ tự hủy các tham số chức năng là gì?

Nếu cơ thể của một số chức năng f với các thông số p_1 ..., p_n các loại T_1 ..., T_n lần lượt ném một ngoại lệ, kết thúc hoặc lợi nhuận, theo thứ tự nào được các thông số bị phá hủy và tại sao? Vui lòng cung cấp tham chiếu đến tiêu chuẩn, nếu có thể.

Ví dụ:

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? 
+2

Tôi không nghĩ rằng việc ném ngoại lệ sẽ tạo ra sự khác biệt lớn liên quan đến thứ tự đánh giá. –

Trả lời

14

Các điểm chính xác trong thời gian mà tại đó các thông số bị phá hủy là unspecified:

CWG quyết định để làm cho nó không xác định liệu đối tượng tham số bị phá hủy ngay sau khi cuộc gọi hoặc tại kết thúc toàn bộ biểu thức mà cuộc gọi thuộc về.

Thứ tự mà các thông số được xây dựng là không xác định là tốt, nhưng vì thông số chức năng có phạm vi khối, mặc dù thứ tự của chúng trong xây dựng là không xác định, hủy diệt là theo thứ tự ngược xây dựng. Ví dụ. xem xét

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

in 10#~0~1with GCC01#~1~0 với Clang; họ xây dựng các thông số theo các thứ tự khác nhau, nhưng cả hai đều phá hủy theo thứ tự ngược lại của xây dựng, vào cuối biểu thức đầy đủ cuộc gọi xảy ra trong (thay vì ngay sau khi trở về người gọi). VC++ prints 10~0~1#.

+2

Có bất kỳ yêu cầu nào về trật tự hủy diệt không? –

+0

@ M.M Tôi tưởng tượng ngay cả khi không có, nó sẽ được ngầm cần thiết vì nếu không nó có thể dễ dàng mess up stuff với RAII, như gây ra một bế tắc với hai ổ khóa được tổ chức và không được phát hành theo thứ tự thích hợp. – Mehrdad

+0

@ M.M Đó có thể là trường hợp trong thực tế. Tuy nhiên, các tham số không có thời gian lưu trữ tự động và không phải là thời gian tạm thời, vì vậy tôi không thể tìm thấy bất kỳ câu lệnh chính thức nào (và tôi không thấy lý do tại sao nó hữu ích). – Columbo

Các vấn đề liên quan