c++ - 籃球規則2018 - 籃球規則犯規




三規則與C++ 11成為五規則? (6)

所以,在看了這個關於右值引用的精彩演講之後,我認為每個類都會受益於這樣一個“移動構造函數”, template<class T> MyClass(T&& other) ,當然還有一個“移動賦值運算符”, template<class T> MyClass& operator=(T&& other)正如Philipp在他的回答中指出的那樣,如果它有動態分配的成員,或者通常存儲指針。 就像你應該有一個copy-ctor,賦值運算符和析構函數,如果前面提到的點適用。 思考?


以下是自1月24日以來的最新狀況和相關進展情況。

根據C ++ 11標準(見附件D [depr.impldec]):

如果類具有用戶聲明的複制賦值運算符或用戶聲明的析構函數,則不推薦使用複制構造函數的隱式聲明。 如果類具有用戶聲明的複制構造函數或用戶聲明的析構函數,則不推薦使用複制賦值運算符的隱式聲明。

實際上已經proposed過時的棄用的行為給C ++ 14一個真正的“五條規則”,而不是傳統的“三條規則”。 在2013年,EWG投票反對在C ++ 2014中實施該提案。 決定提案的主要理由與打破現有代碼的普遍擔憂有關。

最近又有人proposed要適應C ++ 11的措詞,以達到非正式的五項規則,也就是說

如果這些函數中的任何一個是用戶提供的,則不會有編譯器生成的複制函數,移動函數或析構函數。

如果得到EWG的批准,C ++ 17可能會採用“規則”。


在一般情況下,是的,三條規則剛剛成為五分之一,移動賦值運算符和移動構造函數被添加進去。然而,並非所有類都是可複制和可移動的,有些只是可移動的,有些只是可複制的。


我不這麼認為, 三條規則是一條經驗法則,規定一個實現下列其中一個但不是全部的類可能是錯誤的。

  1. 複製構造函數
  2. 賦值運算符
  3. 析構函數

然而,將移動構造函數或移動賦值運算符省略並不意味著錯誤。 這可能是優化時錯過的機會(在大多數情況下),或者移動語義與這個類無關,但這不是一個錯誤。

儘管在相關時定義移動構造函數可能是最佳實踐,但這不是強制性的。 在許多情況下,移動構造函數與類無關(例如std::complex ),並且所有在C ++ 03中正確行為的類將繼續在C ++ 0x中正確行為,即使它們不定義一個移動構造函數。


我們不能說3的規則現在成為4(或5)的規則,而不破壞所有現有的強制執行3的規則並且沒有實現任何形式的移動語義的代碼。

3的規則意味著如果你實現一個你必須實現所有3。

也不知道會有任何自動生成的移動。 “3的規則”的目的是因為它們自動存在,如果你實現一個,它很可能是另外兩個的默認實現是錯誤的。


我無法相信沒有人與this

基本上文章主張“零規則”。 引用整篇文章並不合適,但我相信這是主要觀點:

具有自定義析構函數,複製/移動構造函數或複制/移動賦值運算符的類應該專門處理所有權。 其他類不應該具有自定義析構函數,複製/移動構造函數或複制/移動賦值運算符。

這一點也是恕我直言,重要的是:

標準庫中包含常見的“包中所有權”類: std::unique_ptrstd::shared_ptr 。 通過使用定制的刪除對象,兩者都已經變得足夠靈活以管理幾乎任何類型的資源。


是的,我認為為這樣的類提供移動構造函數會很好,但請記住:

  • 這只是一個優化。

    只實現複製構造函數,賦值運算符或析構函數中的一個或兩個可能會導致錯誤,而沒有移動構造函數可能會降低性能。

  • 移動構造函數不能總是在沒有修改的情況下應用。

    有些類總是分配它們的指針,因此這些類總是在析構函數中刪除它們的指針。 在這些情況下,您需要添加額外的檢查來說明它們的指針是否已分配或已被移走(現在為空)。







rule-of-three