2013-02-23 24 views
3

採取下面的代碼片斷:拋出異常在施工虛擬類的C++ 11

#include <type_traits> 

struct X { virtual ~X(); }; 

static_assert(std::is_nothrow_default_constructible<X>::value, "fail"); 

在鐺SVN,它編譯罰款。但是,對於gcc 4.7.2,斷言失敗。哪一個是正確的? (如果gcc是正確的,爲什麼?)

回答

3

鐺是正確的。

還有的是這方面的一些爭論,但對象的建設導致其析構函數是可能調用

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1424

所以std::is_nothrow_default_constructible<X>不僅測試了默認的構造函數,也~X()

默認~X()有一個隱含的noexcept應用於它。如果您的示例要麼~X()爲私人或刪除它,要麼將其放在noexcept(false)上,那麼static_assert將會失敗。

我懷疑gcc 4.7.2還沒有實現暗含析構函數的規則noexcept

更新

我做了CWG/LWG問題掃在回答以上,但錯過了明顯的:

http://cplusplus.github.com/LWG/lwg-active.html#2116多少卡西奧內裏

感謝下面指出了這一點。 Mea culpa因爲沒有自己選擇這個。我會刪除這個答案,但我認爲它包含的信息可能有幫助。謝謝Cassio Neri。

+0

太好了。在析構函數聲明之後寫'noexcept'暫時解決了這個問題。 – 2013-02-23 21:19:47

+4

@Howard:我可能會遺漏一些東西,但std :: is_nothrow_default_constructible是否必須考慮析構函數是一個開放的問題:http://cplusplus.github.com/LWG/lwg-active.html#2116。你當然明白LWG如何比我更好地工作,所以,如果我的解釋錯了,請糾正我。 (提前致謝)無論如何,這個錯誤已經被報告給GCC:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51452但是(在我看來)它已被擱置等待澄清std :: is_nothrow_default_constructible的定義。 – 2013-02-23 23:53:41