在C++ 11中,如果基類定義了自己的移動(複製)構造函數(賦值運算符),其子類是否需要定義自己的移動(複製)構造函數(賦值運算符)在哪裏調用基類的相應構造函數/運算符顯式調用?在子類中默認移動構造函數
每次都清楚地定義構造函數,析構函數,移動/複製構造函數(賦值運算符)是一個好主意嗎?
struct Base {
Base() {}
Base(Base&& o);
};
struct Sub : public Base {
Sub(Sub&& o) ; // Need I do it explicitly ? If not,what the compiler will do for me
};
編譯器將生成一個默認的移動構造函數,如果你沒有任何的,但並非總是如此(例如參見(http://en.cppreference.com/w/ [對於不是創建時的列表,這個參考] CPP /語言/ move_constructor))。但是,您不能依賴默認移動(或任何其他)構造函數來「做正確的事情」,特別是您不能依賴基類移動構造函數,因爲它不知道任何子類。還請閱讀[三(或自C++ 11以來的五年)規則](https://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29)。 – 2014-09-04 11:52:43
@Joachim:你在吸菸?三規則被「零規則」取代,而不是「五規則」。絕大多數類的默認複製/移動構造函數應該足夠了。 – Puppy 2014-09-04 11:57:17
@Puppy我會說三條規則和零規則相互補充,而不是一個排除或取代另一個。僅僅因爲你可以遵循一些類的零規則,並不意味着你可以(或者應該)爲所有類而做。 – 2014-09-04 12:10:04