C++0x noncopyable

C++03 でコピー禁止のクラスを定義するためには
「コピーコンストラクタとコピー代入演算子を private 宣言して定義はしない」
ということをする必要があった

class hoge {
public:
    hoge() {}
    ~hoge() {}
private:
    hoge(const hoge&);
    hoge& operator=(const hoge&);
};


hoge h1;
hoge h2 = h1; // エラー!private宣言されたコピーコンストラクタにアクセスできない
hoge h3;
h3 = h1;      // エラー!private宣言された代入演算子にアクセスできない


この作業を簡易的に行うために、 Boost C++ Libraries では noncopyable という基本クラスを提供している

class noncopyable {
protected:
    noncopyable() {}
    ~noncopyable() {}
private:
    noncopyable(const noncopyable&);
    const noncopyable& operator=(const noncopyable&);
};


C++0x では Defaulted and Deleted Functions があるので以下のように書ける

struct noncopyable {
    noncopyable() = default;
    noncopyable(const noncopyable&) = delete;
    noncopyable& operator=(const noncopyable&) = delete;
};

この noncopyable クラスを、標準ライブラリの に入れようという提案が出ている


コピー禁止にしたいクラスは noncopyable クラスを private 継承すればいい

template <class T>
class resource_manager : private std::noncopyable {
public:
    resource_manager() : t(new T()) {}
    ~resource_manager() { delete t; }

private:
    T *t;
};


N2600 noncopyable utility class

C++0x言語拡張まとめ