鍋あり谷あり

テーマを決めずに適当に書いています。

コピーできないクラス

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