2016-03-21 145 views
6

在下面的代碼中,我認爲斷言不應該觸發,但它確實。noexcept一個函數返回一個類拋出析構函數

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

A f() noexcept; 

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

功能f()是noexcept很明顯,但noexcept(f())被評估爲假。 (在海灣合作委員會和鐺)

我錯過了什麼,或者它是一個錯誤?

回答

4

表達式e上的noexcept運算符會告訴您表達式的潛在例外是否爲空。這個集合包含析構函數的潛在的異常,按照[except.spec] /(13.2):

如果e隱式調用一個或多個功能(例如,重載操作,在一個新 - 分配函數表達,或者如果e是一個完整的表達式(1.9))析構函數,小號是的並集:[...]的類型中的所有這樣的功能異常規範集合

+0

是這在C++ 17草案?我無法在C++ 14標準中找到你的passge。 – Simple

+0

@簡單:是的,它是從頭開始的。好問題,我不知道這最後一次發生了什麼變化。 –

+0

@Simple:看起來像在[CWG 1992](http://wg21.link/cwg1992)的決議中添加了措辭,該決議在2016年2月會議上被接受爲缺陷報告。作爲一個缺陷意味着這個問題可以追溯到所有以前的修訂,但是,因爲它基本捕獲了*應該*的含義。 –

相關問題