2016-03-21 19 views
6

Trong đoạn mã sau, tôi nghĩ rằng xác nhận không nên kích hoạt nhưng nó có.noexcept của một hàm trả về một lớp có ném destructor

struct A 
{ 
    ~A() noexcept(false); 
}; 

A f() noexcept; 

int main() 
{ 
    static_assert(noexcept(f()), "f must be noexcept"); 
} 

Chức năng f() không rõ ràng, nhưng noexcept(f()) được đánh giá là sai. (trong cả gcc và clang)

Tôi có thiếu thứ gì đó hay là lỗi?

Trả lời

4

Nhà điều hành noexcept trên biểu thức e cho bạn biết bộ ngoại lệ tiềm năng của biểu thức có trống không. Bộ này chứa các trường hợp ngoại lệ tiềm năng của destructor, theo [except.spec]/(13.2):

Nếu e ngầm gọi một hoặc nhiều chức năng (chẳng hạn như một nhà điều hành quá tải, một chức năng phân bổ trong một mới- biểu hiện, hoặc một destructor nếu e là một full-biểu thức (1.9)), S là sự kết hợp của: [...] bộ các loại trong thông số kỹ thuật ngoại lệ của tất cả các chức năng như vậy

+0

is điều này trong một bản thảo C++ 17? Tôi không thể tìm thấy passge của bạn trong tiêu chuẩn C++ 14. – Simple

+0

@ Đơn giản: Có, từ đầu. Câu hỏi hay, tôi không biết khi nào điều này thay đổi lần cuối. –

+0

@ Đơn giản: Có vẻ như từ ngữ đã được thêm vào như một phần của độ phân giải của [CWG 1992] (http://wg21.link/cwg1992), được chấp nhận là Báo cáo lỗi tại cuộc họp tháng 2 năm 2016. Là một khiếm khuyết có nghĩa là vấn đề có thể được sửa đổi trước cho tất cả các phiên bản trước đó, mặc dù, vì nó nắm bắt về cơ bản những gì * nên * luôn luôn có nghĩa là. –

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