2014-10-08 155 views
5

是否有任何編譯器標誌強制執行下一個規則?如何在存在用戶定義的析構函數時禁用隱式定義的複製構造函數生成

如果T具有用戶定義的析構函數或用戶定義的複製賦值運算符,則不建議使用隱式定義的複製構造函數的生成。

的隱式定義的拷貝賦值運算符的生成是 棄用(因爲C++ 11)如果T具有用戶聲明的析構函數或 用戶聲明的複製構造。

我有興趣在Clang,Visual Studio 2013或GCC中強制執行任何規則,因爲代碼庫將與它們一起編譯。

+0

你可以只從'noncopyable'繼承:HTTP://www.boost.org/doc/libs/1_55_0/libs/utility/utility.htm#Class_noncopyable – EdChum 2014-10-08 09:37:14

+0

爲VS,你可以激活「的警告,原樣錯誤「 – 2014-10-08 09:39:20

+0

@MarcoA。這是一個警告嗎?在哪個版本和什麼警告級別? – Felics 2014-10-08 09:39:52

回答

5

bug report提到不發射在海灣合作委員會警告這個測試用例:

struct W { 
    int a; 
    ~W() { a = 9; } 
}; 

int main() { 
W w {}; 
W v = w; 
} 

參考喬納森Wakely的評論:

這是不正確,編譯器可以(不)警告法定代碼。

我確認這一點,我們會希望在某些時候的警告,它 將使我們能夠提高-Weffc++警告這一部分:

*項目11:定義一個拷貝構造函數和賦值運算符用於動態分配內存的類。

(見PR 16166 瞭解詳細信息)

也許我們可以把這種警告-Wdeprecated-special-members和 有它啓用-Weffc++和C++ 11也-Wdeprecated

鏘已經警告說,這個與-Wdeprecated

main.cpp:3:3: warning: definition of implicit copy constructor for 'W' is deprecated because it has a user-declared destructor [-Wdeprecated] 

    ~W() { a = 9; } 

^

main.cpp:8:8: note: implicit copy constructor for 'W' first required here 

W v = w; 

Microsoft明確指出,Visual Studio將不會發出在這種情況下警告:

此外,C++ 11標準規定了以下附加 規則:

  • 如果一個拷貝構造函數和析構函數是顯式聲明,那麼不贊成使用複製賦值操作符的自動生成。

  • 如果明確聲明瞭複製賦值運算符或析構函數,則不建議自動生成複製構造函數。

在這兩種情況下,Visual Studio將繼續隱含自動生成 必要的功能,並且不會發出警告。

+1

-Wdeprecated對我來說已經足夠了。我已經有警告作爲錯誤:) – Felics 2014-10-08 09:41:53

相關問題