C++の設計と進化を読んでいたら、324ページの監註に:
private にした代入およびコピーコンストラクタを(宣言のみで)実装しなければ、リンク時にエラーとなることでコピーを抑止できます。残念ながら、コンパイル時には抑止できませんけど。
とあるのだが、もちろんコンパイル時に抑止する方法もある。
ありがちなのは、基底クラスでコンストラクタ達を private とする方法だ:
struct NoCopy { NoCopy(){} private: NoCopy( const NoCopy & ); NoCopy & operator=( const NoCopy & ); }; struct X : public NoCopy { void f(){ X a; // OK. X c=a; // error. X d(a); // error. X b; b=a; // error. } };
まあまあ知られている方法だと思う。
もう一つ。クラス一つで完結する方法もあるが、こちらは合法なのかどうかやや微妙。たぶん合法だと思うんだが、実装依存かも:
struct Y { Y(){} template< typename > Y( const Y & ); template< typename > Y & operator=( const Y & ); void f(){ Y a; // OK. Y c=a; // error. Y d(a); // error. Y b; b=a; // error. } };