2014-10-08 15 views
8

Đối với đoạn mã sauchức năng-thử-block và noexcept

struct X 
{ 
    int x; 
    X() noexcept try : x(0) 
    { 
    } 
    catch(...) 
    { 
    } 
}; 

Visual studio 14 CTP vấn đề cảnh báo

cảnh báo C4297: 'X :: X': chức năng giả định không để ném một ngoại lệ nhưng không

lưu ý: __declspec (nothrow), ném(), noexcept (true), hoặc noexcept được quy định về chức năng

Đây có phải là lạm dụng của noexcept không? Hoặc là một lỗi trong trình biên dịch của Microsoft?

Trả lời

11

Hoặc là lỗi trong trình biên dịch của Microsoft?

Không hoàn toàn.

Một khối chức năng gọi là như thế này không thể ngăn chặn một ngoại lệ sẽ ra ngoài. Hãy xem xét rằng đối tượng không bao giờ được xây dựng đầy đủ vì hàm tạo không thể hoàn thành việc thực thi. Các catch -block phải vứt cái gì khác hoặc ngoại lệ hiện tại sẽ được rethrown ([except.handle]/15):

Ngoại lệ hiện xử lý được rethrown nếu kiểm soát đạt đến cuối của một handler của function-try-block của một hàm tạo hoặc destructor.

Do đó trình biên dịch suy ra rằng hàm tạo thực sự có thể ném.

struct X 
{ 
    int x; 
    X() noexcept : x(0) 
    { 
     try 
     { 
      // Code that may actually throw 
     } 
     catch(...) 
     { 
     } 
    } 
}; 

Nên biên dịch mà không có cảnh báo.

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