2014-10-08 32 views
8

對於下面的代碼功能試塊和noexcept

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

的Visual Studio 14 CTP發出警告

警告C4297: 'X :: X':功能假定不拋出例外,但 確實

注:__declspec(拋出異常),擲(),noexcept(真),或noexcept指定的功能

這是否是noexcept的濫用?或者它是微軟編譯器中的錯誤?

回答

11

或者它是微軟編譯器中的錯誤?

不完全。

像這樣的所謂的功能嘗試塊不能防止異常會出現在外面。考慮到構造函數無法完成執行,因此該對象從未完全構造。該catch - 阻塞有別的扔東西或當前異常將被重新拋出([except.handle]/15):

如果控制到達的處理程序結束 當前處理的異常被重新拋出函數嘗試塊的構造函數或 析構函數。

因此,編譯器推斷構造函數確實可以拋出。

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

應該在沒有警告的情況下進行編譯。