2013-03-30 64 views
24

我有點困惑與破壞者和noexcept。我的理解是,在C++ 11中,包括用戶定義在內的任何析構函數都隱含地是noexcept(true),即使我們從它那裏得到throw。如果出於某種原因需要這樣做,則必須明確指定noexcept(false)破壞者和不接受

我看到的與GCC 4.7.2完全相反,用戶定義的析構函數,無論類和析構函數有多簡單,都暗含noexcept(false)。我在這裏錯過了什麼?是否有一些隱藏的用戶定義的析構函數?

+4

12.4/3:「在沒有異常規格析構函數的聲明被視爲隱含使 具有與隱式聲明(15.4)相同的異常規範。「即如果所有成員和基礎都有noexcept析構函數,析構函數只是'noexcept(true)'。 – ipc

回答

16

這是一個known bug(用於發現錯誤報告的信用點),它似乎已在GCC 4.8.0中修復。例如,下面的靜態斷言將火上GCC 4.7.2,但不是在GCC 4.8.0:

struct X 
{ 
    ~X() { }; 
}; 

int main() 
{ 
    X x; 

    // This will not fire even in GCC 4.7.2 if the destructor is 
    // explicitly marked as noexcept(true) 
    static_assert(noexcept(x.~X()), "Ouch!"); 
} 
+3

我其實並沒有想到使用「bug」作爲額外的搜索關鍵字。現在我做了(感謝你),發現了[Bug 56191](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191)。感謝您的及時響應! – lapk

+0

@PetrBudnik:感謝您的鏈接,我會將其添加到答案! –