2016-09-16 90 views
4
#include <iostream> 
using namespace std; 


    class NoConstructOperation 
    { 
    protected: 
     NoConstructOperation() = default; 
     virtual ~NoConstructOperation() = default; 
    public: 
     NoConstructOperation(const NoConstructOperation&) = delete; 
     NoConstructOperation& operator =(NoConstructOperation&) = delete; 
     NoConstructOperation(NoConstructOperation&&) = delete; 
     NoConstructOperation& operator = (NoConstructOperation&&) = delete; 
    }; 

class Myclass:public NoConstructOperation 
{ 

}; 


int main() { 
    static_assert(!std::is_trivially_destructible<Myclass>::value, "Compiler provided destructor is public: Please declare it private"); 
    return 0; 
} 

工作,如果我不NoConstructOperation上面的代碼繼承Myclass給人以靜態斷言編譯錯誤。
但如果我繼承MyclassNoConstructOperationis_trivially_destructible檢查不起作用,即使Myclass構造函數是公共的。此代碼編譯,是什麼原因?`is_trivially_destructible`不繼承類

+3

你想用這個做什麼? – Hayt

回答

9

您正在將NoConstructorOperation的析構函數定義爲virtual。刪除virtual將按預期觸發靜態斷言:wandbox example

cplusplus.com

甲平凡破壞類是一類(有類,結構或聯合定義):

  • 採用隱含定義析構函數。

  • 析構函數不是虛擬的。

  • 它的基類和非靜態數據成員(如果有的話)本身也是可以破壞的類型。

從標準草案N4567 $ 12.4:

析構函數是平凡的,如果它不是用戶提供的,並且如果:

(5.4) - 的析構函數不是虛擬的,

(5.5) - 其類的所有直接基類具有微不足道的析構函數,並且

(5.6) - 對於類的類型(或其數組)的所有類的非靜態數據成員,每個這樣的類都有一個微不足道的析構函數。

+0

雖然使得非虛擬的基類析構函數可能會產生不同的副作用。 – Hayt

+0

這不是唯一的問題 –

+0

我想強制執行我的客戶端類Myka應該複製/移動構造函數/賦值爲已刪除,並且構造函數和析構函數位於「private」範圍內。 任何更好的方法。 –