以下代碼是合法的嗎?C++:noexcept(或throw())virtual destructor = default;
class C
{
virtual ~C() noexcept = default;
};
或
class C
{
virtual ~C() throw() = default;
};
(擲()已過時,但我的編譯器不支持noexcept ;;)
以下代碼是合法的嗎?C++:noexcept(或throw())virtual destructor = default;
class C
{
virtual ~C() noexcept = default;
};
或
class C
{
virtual ~C() throw() = default;
};
(擲()已過時,但我的編譯器不支持noexcept ;;)
8.4.2 [dcl.fct.def。默認]顯式默認函數只有在與隱式聲明的異常說明兼容(15.4)時纔可以有明確的異常說明。
15.4/3 [except.spec]兩個異常SPECI音響陽離子是兼容,如果:
- 兩者都是非投擲(見下文),無論其形式如何,
- 都具有noexcept的形式(常量表達式)和常量表達式是等價的,或者
- 都是動態異常speci fi cations有th一組相同的調整類型。
所以,如果它恰好一個析構函數的隱式聲明必須匹配,你只能給一個明確的異常規範。
的異常規範,所述隱式析構函數將具有取決於它的函數將調用:
15.4/14 [except.spec]的隱式聲明的特殊成員函數應具有一個異常SPECI音響陽離子。如果f是一個隱式聲明的析構函數,它的隱式異常規範指定了type-id T當且僅當T被f的隱式定義直接調用的函數的異常規範所允許;如果它直接調用的任何函數允許所有的異常,f應允許所有的異常,並且如果它直接調用的每個函數都不允許有例外,那麼f將不允許異常。
一個析構函數調用是類的非靜態數據成員,它的基類的,其虛基類的析構函數的功能。
就你而言,由於該類沒有數據成員,也沒有基類,因此它沒有調用任何函數,因此它屬於最後一種情況。它直接調用的每個函數(沒有)不允許有任何異常,所以這個析構函數不能有任何例外。因此,您的異常規範必須是非拋出的,因此nothrow
,except()
和exception(constant expression that yields true)
是您可以給出的唯一適當的異常規範,因此您的代碼很好。
我認爲應該是。 – bolov