2013-07-05 130 views
9

在C++中的常見模式是使複製構造私人:是一個私人移動構造函數來防止移動?

class A 
{ 
    public: 
     // ... 
    private: 
     A(const A&); 
}; 

但是將以下代碼然後編譯(在C++ 11/14):

A f(); 

auto a = f(); 

標準包含的信息關於自動生成移動構造函數。我既沒有訪問標準,也沒有實際生成移動構造函數的編譯器。我的問題是:是否必須寫

class A 
{ 
    public: 
     // ... 
    private: 
     A(const A&); 
     A(const A&&); 
}; 

防止移動(以及操作員=類似)?

+1

如果你寫了一個拷貝構造函數,它不會生成一個移動構造函數。 –

+2

用戶聲明的副本禁止生成移動成員。 – Xeo

+3

請注意,您提到的模式是針對C++ 98/03的,但現在在C++ 11中已棄用,這要感謝「delete」構造函數/賦值運算符(例如'ClassName(ClassName &&)= delete; '顯式地阻止隱式移動構造函數)。 – syam

回答

13

但是將以下代碼然後編譯(在C++ 11/14):

不,它不會。用戶聲明的拷貝構造函數的存在應該禁止隱式生成移動構造函數。每款C++ 11標準的12.8/9:

如果一個類X的定義不明確宣佈此舉的構造函數,一個將被隱式聲明 欠繳當且僅當

- X沒有一個用戶聲明的拷貝構造函數

- X沒有一個用戶聲明的拷貝賦值運算符,

- X沒有一個用戶聲明的舉動賦值運算符,

- X沒有一個用戶聲明的析構函數,並

- 此舉構造不會被隱式定義爲刪除。

+0

太棒了!我再次對此印象深刻! :-) – Petter

+0

@Ben:很高興幫助:) –