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