web-dev-qa-db-ja.com

コンパイラ生成のコピー割り当て演算子を無効にします

クラスを書いているとき(たとえばclass nocopy)、コピー演算子の存在を完全に防ぐことは可能ですか?定義しないで、他の誰かが

nocopy A;
nocopy B;
A = B;

コンパイラーは定義を自動生成します。自分で定義した場合、コンパイラが自動生成するのを防ぎますが、上記のコードは引き続き有効です。

上記のコードを違法にし、コンパイル時エラーを生成します。それ、どうやったら出来るの?

33
Malabarba

privateアクセス指定子でコピーコンストラクタを宣言するだけで、定義することすらできません。
それを使用しようとすると、privateと宣言されているため、コンパイルエラーが発生します。

誰かが間接的に使用した場合、リンクエラーが発生します。

C++ 03ではそれ以上のことはできません。

ただし、C++ 11では特別なメンバー関数を明示的に削除ができます。

例えば:

struct NonCopyable {
    NonCopyable & operator=(const NonCopyable&) = delete;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable() = default;
};
57
Alok Save

通常の方法は、コピーコンストラクタと代入演算子をプライベートに宣言することです。これにより、Alsが説明したように、コンパイルエラーが発生します。

boost::noncopyableから派生すると、この仕事が自動的に行われます。

5
thiton

_boost::noncopyable_を継承すると、コピーコンストラクターを試行したときにコンパイル時エラーが発生します。これを使用すると、エラーメッセージ(MSVCを使用)は、通常はエラーの原因となった行を指さないため、役に立たないことがわかりました。別の方法は、コピーコンストラクタprivateを宣言して未定義のままにするか、BOOST_STATIC_ASSERT(false)で定義することです。 C++ 11で作業している場合は、コピーコンストラクタをdeleteすることもできます。

_class nocopy
{
    nocopy( nocopy const& ) = delete;
};
_
4
K-ballo