2015-10-13 9 views
9

を作り、私はクラスのコピー不能を作るためにこれを使用することもできます。C++ 11の前にクラス以外のコピー可能*と*非可動

private: 
MyClass(const MyClass&); 
MyClass& operator=(const MyClass&); 

C++ 11で、私はそれを行うことができます

MyClass(const MyClass&) = delete; 
MyClass& operator=(const MyClass&) = delete; 

削除されたコピーと割り当てを持つクラスを使用する場合、デフォルトの移動演算子が生成される可能性はありますか?そして、クラスは正確にコピーされていませんが、結局のところ(これは類似しています)移動しましたか? ...

MyClass(MyClass&&) = delete; 
MyClass& operator=(MyClass&&) = delete; 

だから、私はデフォルトの移動の建設とassignmnentを防ぐために、これをしなければならないのですか?

+0

§。個人的には、このようなものを 'NoCopyOrMove'というプライベートベースクラスに入れてしまい、コードが乱雑にならないようにします。 – MikeMB

+0

'MyClass(MyClass &&)= delete;'は暗黙的に他のものを無効にします – sp2danny

答えて

14

コメントで既に述べたように、削除されたコンストラクタはC++ 11で導入されました。あなたの質問に答えるために、次の規則は、一般的に保持する:

  1. 2つのコピー操作が独立しています。コピーコンストラクタを宣言しても、コンパイラがコピーの代入を生成することはありません。 (C++ 98と同じ)
  2. 移動操作は独立していません。 Declareは、コンパイラが他のものを生成しないようにします。 (コピー操作とは異なります)
  3. コピー操作のいずれかが宣言されている場合、移動操作は生成されません。
  4. 移動操作のいずれかが宣言されている場合、コピー操作は生成されません。これは、これまでとは逆のルールです。
  5. デストラクタが宣言されている場合、移動操作は生成されません。コピー操作は、C++ 98との下位互換性のために生成されます。
  6. コンストラクタが宣言されていない場合にのみ、デフォルトのコンストラクタが生成されます。

コメントで要求されたように、ここで(C++ 11ドラフトN3242で)いくつかの源である(同じC++ 98のように):

  • コピー操作:12.8.8を§、§ 12.8.19
  • 移動操作:、12.8.10§12.8.21
  • デフォルトのコンストラクタを§:あなたがそれを必要としない12.1.5
+1

あなたはこれらの事実をどこから得ましたか? – Yola

+3

それは私の知識でした:)あなたの要求に応じて、私は自分の答えを広げ、それをサポートするためにC++標準への引用を追加しました。 – mcserep

10

コピーコンストラクタを宣言すると、コンストラクタ/代入は生成されません。 so

MyClass(MyClass&&) = delete; 
MyClass& operator=(MyClass&&) = delete; 

は必須ではありません。

さらに明示的に追加できます。

+0

明示的にすることは良いです:私は常にすべての演算子を宣言し、必要のないものを選択的に 'delete'します。私の意図ははっきりしています。コンパイラのバグがある場合には、私が期待した通りに動作するはずです。 –

関連する問題