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.
}
};