21

移動不可能な型の場合、(ベスト プラクティスの観点から) 以下で十分ですか?

class A
{
   A(const A&) = delete;
   A(A&&) = delete;
   A& operator=(A) = delete;
public:
   A();
};

または、コピー/移動代入演算子を個別に削除する必要がありますか? ここでもデストラクタが必要ですか?

4

2 に答える 2

8

はい、コピー コンストラクターとコピー代入演算子を宣言するdeletedだけで十分です。コピー コンストラクターとコピー代入演算子を宣言しているため、ムーブ コンストラクターとムーブ代入演算子は自動的に生成されません。それらを明示的に宣言する必要はありませんdeleted

§12.8/9 から (強調を追加)

クラス X の定義でムーブ コンストラクターが明示的に宣言されて いない場合、X にユーザー宣言のコピー コンストラクターがない場合、および X にユーザー宣言のコピー代入演算子がない場合にのみ、暗黙的にデフォルトとして宣言されます。 、 — X にはユーザー宣言の移動代入演算子 がありません。 — X にはユーザー宣言のデストラクタがありません 。 — 移動コンストラクタは削除済みとして暗黙的に定義されません。




§12.8/20 から (強調を追加)

クラス X の定義で移動代入演算子が明示的に宣言されて いない場合、X にユーザー宣言のコピー コンストラクターがない場合、および X にユーザー宣言の移動コンストラクターがない場合にのみ、暗黙的にデフォルトとして宣言されます。 、 — X にはユーザー宣言のコピー代入演算子 がありません。 — X にはユーザー宣言のデストラクタがありません。そして — ムーブ代入演算子は暗黙的に削除済みとして定義されません。




于 2013-07-04T21:53:03.820 に答える