web-dev-qa-db-ja.com

コピーコンストラクターとコピー代入演算子を削除します。それらのどれが不可欠ですか?

オブジェクトをコピーしてはならないというユースケースがあります。コピーコンストラクターとコピー代入演算子の削除の誇張された完全なリストを以下に書きました。それらの数が多すぎて、どれを使用すればよいかわからず、時にはこれが私を妄想的にさせます。それらすべてを自分のコードに書く必要はありませんよね?それで、どんな種類のオブジェクトコピーも防ぐために、私はそれらのどれを使うべきですか?

        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;
15
hkBattousai

単一のコピーコンストラクターとコピー代入演算子をdeleteとしてマークするだけで済みます。コピーバージョンが存在すると、ムーブコンストラクターとムーブ代入演算子の暗黙的な宣言が防止され、コピー特殊メンバー関数の1つの形式を宣言すると、他の形式の暗黙的な宣言が抑制されます。

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

C++ 11以降では、デフォルトとしての代入演算子の暗黙的な定義は非推奨であり、代わりに削除済みとして定義する必要があることに注意してください。

23
TartanLlama

コピーコンストラクタ

MyClass             (const  MyClass &)  = delete;

代入演算子

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

これらは、暗黙的に定義された唯一のコピーコンストラクターとコピー代入演算子です。

5
Brahim