簡體   English   中英

C ++:noexcept(或throw())virtual destructor = default;

[英]C++ : noexcept (or throw()) virtual destructor = default;

以下代碼合法?

class C
{
    virtual ~C() noexcept = default;
};

要么

class C
{
    virtual ~C() throw() = default;
};

(throw()已棄用,但我的編譯器不支持noexcept ;;)

8.4.2 [dcl.fct.def.default]明確默認的函數[...]只有在與隱式聲明中的異常規范兼容(15.4)時才有明確的異常規范。

15.4 / 3 [except.spec]如果符合以下條件,則兩個異常規范兼容:

  • 兩者都是非投擲的(見下文),無論其形式如何,
  • 兩者都有noexcept(constant-expression)形式,而constant-expression是等價的,或者
  • 兩者都是具有相同調整類型集的動態異常規范。

因此,如果它與析構函數的隱式聲明所具有的完全匹配,則只能提供顯式異常規范。

隱式析構函數具有的異常規范取決於它將調用的函數:

15.4 / 14 [except.spec]隱式聲明的特殊成員函數應具有異常規范。 如果f是一個隱式聲明的析構函數,它的隱式異常規范指定了type-id T當且僅當T被f的隱式定義直接調用的函數的異常指定所允許時; 如果它直接調用的任何函數允許所有異常,則f應允許所有異常,如果它直接調用的每個函數都不允許異常,則f不允許異常。

析構函數調用的函數是類的非靜態數據成員,其基類和虛擬基類的析構函數。

在您的情況下,由於該類沒有數據成員且沒有基類,因此它不調用任何函數,因此它屬於最終情況。 它直接調用的每個函數(沒有)都不允許異常,所以這個析構函數必須不允許異常。 因此,你的異常規范必須是非拋出的,所以不要nothrowexcept()exception(constant expression that yields true)是你能給出的唯一合適的異常規范,所以你的代碼很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM