我有一個問題,因爲C++ 11默認生成複製構造函數和複製賦值運算符時存在用戶定義的析構函數。在C++中禁用複製類的最簡潔的方法
對於最簡單的類,默認生成的構造函數,運算符和析構函數都很好。考慮以下原因來聲明析構函數:
使平凡的析構函數在基類的虛:
// header class Base1 { public: virtual ~Base1() = default; }; class Base2 { public: virtual ~Base2(); }; // source Base2::~Base2() = default;
會所有4複製和移動通過編譯器在這些情況下產生的特殊的方法?如果是,那麼我認爲這很好,並且不需要使
Base1
或Base2
複雜化。在析構函數打印調試消息:
// header class D { public: ~D(); }; // source D::~D() { #ifdef DEBUG_THIS std::cout << "D was destructed." << std::endl; #endif }
我認爲,在這種情況下,拷貝構造函數和賦值運算符將產生;但移動構造函數和賦值操作符不會。我想避免使用已棄用的默認生成並禁用
D
的複製。我也想避免洪水D
與4deleted
聲明。僅禁用一個拷貝構造函數就夠了嗎?這是一種很好的風格嗎?
我不明白你在討論棄用的問題。你能澄清一下嗎? – stefan
在standard-C++ - land中,您只能從不可複製的類繼承,如'boost :: noncopyable'。使用Visual C++,您可能會考慮添加私有聲明的宏,以避免愚蠢警告。 –
@stefan,*如果T具有用戶定義的析構函數或用戶定義的複製賦值運算符,則不推薦使用隱式定義的複製構造函數的生成。*自C++ 11以來(請參見http://en.cppreference.com/ W/CPP /語言/ copy_constructor#隱式defined_copy_constructor)。 – vedg