2008-12-02 3 views
16

Mã này dẫn đến hành vi undefined:Goto và destructors có tương thích không?


void some_func() { 
    goto undefined; 
    { 
    T x = T(); 
    undefined: 
    } 
} 

Các nhà xây dựng không được gọi.

Nhưng còn mã này thì sao? Liệu destructor của x được gọi là? Tôi nghĩ rằng nó sẽ được, nhưng tôi muốn chắc chắn. :)


void some_func() { 
    { 
    T x = T(); 
    goto out; 
    } 
    out: 
} 
+0

Mẫu mã đầu tiên không dẫn đến hành vi không xác định, nó là bất hợp pháp và sẽ không biên dịch. –

+0

"không biên dịch" là một ví dụ về hành vi không xác định, tôi nghĩ vậy. Cuốn sách tôi đang đọc nói "hành vi không xác định". –

+2

Hai kỹ thuật khác nhau: nếu trình biên dịch là cần thiết để từ chối chương trình, đó là "ít xấu" từ POV của lập trình viên hơn là một cái gì đó có thể biên dịch và thiết lập nhà của mình trên lửa khi nó chạy. Một số trình biên dịch từ chối những thứ hợp pháp nhưng trình biên dịch đó biết sẽ không xác định. –

Trả lời

42

Có, trình hủy sẽ được gọi như mong đợi, giống như bạn đã thoát khỏi phạm vi sớm do ngoại lệ.

(báo cáo Jump) 6.6/2 Standard:

On thoát khỏi phạm vi (tuy nhiên thực hiện), destructor được gọi cho tất cả các đối tượng được xây dựng với thời gian lưu trữ tự động được khai báo trong phạm vi đó, theo thứ tự ngược lại tuyên bố của họ.

+0

Có báo giá từ tiêu chuẩn về điều đó không? –