クラスを書いているとき(たとえばclass nocopy
)、コピー演算子の存在を完全に防ぐことは可能ですか?定義しないで、他の誰かが
nocopy A;
nocopy B;
A = B;
コンパイラーは定義を自動生成します。自分で定義した場合、コンパイラが自動生成するのを防ぎますが、上記のコードは引き続き有効です。
上記のコードを違法にし、コンパイル時エラーを生成します。それ、どうやったら出来るの?
private
アクセス指定子でコピーコンストラクタを宣言するだけで、定義することすらできません。
それを使用しようとすると、private
と宣言されているため、コンパイルエラーが発生します。
誰かが間接的に使用した場合、リンクエラーが発生します。
C++ 03ではそれ以上のことはできません。
ただし、C++ 11では特別なメンバー関数を明示的に削除ができます。
例えば:
struct NonCopyable {
NonCopyable & operator=(const NonCopyable&) = delete;
NonCopyable(const NonCopyable&) = delete;
NonCopyable() = default;
};
通常の方法は、コピーコンストラクタと代入演算子をプライベートに宣言することです。これにより、Alsが説明したように、コンパイルエラーが発生します。
boost::noncopyable
から派生すると、この仕事が自動的に行われます。
_boost::noncopyable
_を継承すると、コピーコンストラクターを試行したときにコンパイル時エラーが発生します。これを使用すると、エラーメッセージ(MSVCを使用)は、通常はエラーの原因となった行を指さないため、役に立たないことがわかりました。別の方法は、コピーコンストラクタprivate
を宣言して未定義のままにするか、BOOST_STATIC_ASSERT(false)
で定義することです。 C++ 11で作業している場合は、コピーコンストラクタをdelete
することもできます。
_class nocopy
{
nocopy( nocopy const& ) = delete;
};
_