2017-06-08 19 views
4

根據以下廣爲人知的表格,默認拷貝構造函數和拷貝分配的自動編譯器生成在C++ 11中被棄用,當一個或多個拷貝分配copy構造函數和析構函數由用戶提供(紅色單元格表示棄用)。根據「3條規則」,這是非常有意義的。但是,該表顯示在用戶提供的拷貝構造函數/賦值的情況下,不推薦使用缺省析構函數的生成。規則3默認成員在C++ 11中棄用

這個設計決定背後的基本原理是什麼?

Reference Table

+0

@Angew \t看起來好像我向後迴避;)謝謝你的擡頭,將編輯 – chili

+0

你怎麼能沒有析構函數?有些東西需要解構成員變量。 – Galik

+0

@Galik這只是意味着這個dtor也必須由用戶提供。 – Angew

回答

2

爲什麼它應該被棄用?對象完全有可能需要特殊的複製屬性,但是其銷燬可以完全由其子對象析構函數決定。考慮一個簡單的克隆指針:

template <class T> 
class cloning_ptr 
{ 
    std::unique_ptr<T> p; 

public: 
    cloning_ptr(const cloning_ptr &src) : p(std::make_unique<T>(*src.p) {} 
    cloning_ptr(cloning_ptr &&) = default; 

    cloning_ptr& operator= (cloning_ptr rhs) 
    { swap(p, rhs.p); return *this; }  
}; 

沒有理由提供一個析構函數來執行與默認值不同的任何操作。

另一種解決方法是不同的:如果你需要在dtor中做特殊的事情,這可能意味着在類中建立了一些非標準的所有權。非標準所有權很可能也需要在複製操作中處理。