オブジェクトをコピーしてはならないというユースケースがあります。コピーコンストラクターとコピー代入演算子の削除の誇張された完全なリストを以下に書きました。それらの数が多すぎて、どれを使用すればよいかわからず、時にはこれが私を妄想的にさせます。それらすべてを自分のコードに書く必要はありませんよね?それで、どんな種類のオブジェクトコピーも防ぐために、私はそれらのどれを使うべきですか?
MyClass ( MyClass &) = delete;
MyClass (const MyClass &) = delete;
MyClass ( MyClass &&) = delete;
MyClass (const MyClass &&) = delete;
MyClass operator=( MyClass &) = delete;
MyClass operator=(const MyClass &) = delete;
const MyClass operator=( MyClass &) = delete;
const MyClass operator=(const MyClass &) = delete;
MyClass & operator=( MyClass &) = delete;
MyClass & operator=(const MyClass &) = delete;
const MyClass & operator=( MyClass &) = delete;
const MyClass & operator=(const MyClass &) = delete;
MyClass && operator=( MyClass &) = delete;
MyClass && operator=(const MyClass &) = delete;
const MyClass && operator=( MyClass &) = delete;
const MyClass && operator=(const MyClass &) = delete;
MyClass operator=( MyClass &&) = delete;
MyClass operator=(const MyClass &&) = delete;
const MyClass operator=( MyClass &&) = delete;
const MyClass operator=(const MyClass &&) = delete;
MyClass & operator=( MyClass &&) = delete;
MyClass & operator=(const MyClass &&) = delete;
const MyClass & operator=( MyClass &&) = delete;
const MyClass & operator=(const MyClass &&) = delete;
MyClass && operator=( MyClass &&) = delete;
MyClass && operator=(const MyClass &&) = delete;
const MyClass && operator=( MyClass &&) = delete;
const MyClass && operator=(const MyClass &&) = delete;
単一のコピーコンストラクターとコピー代入演算子をdelete
としてマークするだけで済みます。コピーバージョンが存在すると、ムーブコンストラクターとムーブ代入演算子の暗黙的な宣言が防止され、コピー特殊メンバー関数の1つの形式を宣言すると、他の形式の暗黙的な宣言が抑制されます。
MyClass (const MyClass&) = delete;
MyClass& operator= (const MyClass&) = delete;
C++ 11以降では、デフォルトとしての代入演算子の暗黙的な定義は非推奨であり、代わりに削除済みとして定義する必要があることに注意してください。
MyClass (const MyClass &) = delete;
MyClass & operator=(const MyClass &) = delete;
これらは、暗黙的に定義された唯一のコピーコンストラクターとコピー代入演算子です。