2012-06-12 75 views
6

根據C++的11個標準默認移動構造函數時,纔會生成,如果:明確違約移動構造函數

  • X沒有一個用戶聲明的拷貝構造函數,
  • X沒有一個用戶聲明的拷貝賦值運算符,
  • X沒有一個用戶聲明的舉動賦值運算符,
  • X沒有一個用戶聲明的析構函數,並
  • 此舉構造不會被隱式定義已刪除。

我還可以明確地默認它嗎?似乎在叮噹中正常工作。像這樣的例子:

class MyClass { 
private: 
    std::vector<int> ints; 
public: 
    MyClass(MyClass const& other) : ints(other.ints) {} 
    MyClass(MyClass&& other) = default; 
}; 

回答

10

該規則的動機是,如果默認的拷貝構造函數不適合你的班上做,那麼很有可能是默認的移動構造函數將不起作用任(第5條規則,或無論我們在C++ 11中做什麼)。所以是的,你可以明確地默認它,作爲程序員的榮譽,它可以工作。

在您的示例代碼中,您可以刪除複製構造函數,因爲它與默認值相同。

3

是的,您始終可以顯式調用默認生成函數,這些函數可以使用= default自動生成。這就是語法的意義。