2014-01-19 30 views

回答

4

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)是您可以給出的唯一適當的異常規範,因此您的代碼很好。

+0

謝謝!那麼,在這種情況下(C類),雖然我沒有給出任何異常規範,但析構函數是noexcept? – ikh

+0

糟糕,我在閱讀你的答案時調整了答案; – ikh

+0

@ikh你真的接受了它,但它現在是正確的:你的異常規範必須是非拋出的。如果你沒有給出任何異常規格,它也不會拋出。 –