別のタイプからの割り当てで初期化できるが、コピーできないタイプを作成しようとしています。このタイプのオブジェクトがその存続期間中リソースを所有するようにしたいという点で、スコープ付きスマートポインターの考え方と似ていますが、割り当て構文も使用できるようにしたいのです。あらすじでは、これが私が欲しいものです:
T x = new U; // allowed
T y(new U); // allowed
T z = x; // not allowed
T x2(x) // not allowed
これは私がこれまでに試したことです...
#include <boost/noncopyable.hpp>
class U {};
class T : boost::noncopyable {
public:
T(U *p) : p_(p) {
}
~T() {
delete p_;
}
operator bool() const { return p_ != 0; }
private:
U *p_;
};
int main() {
T x = new U; // allowed
T y(new U); // allowed
//T z = x; // not allowed
//T x2(x) // not allowed
}
残念ながら、エラーが発生します。
$ g ++ test.cc -o test /usr/include/boost/noncopyable.hpp:コピーコンストラクター内'T :: T(const T&)':/usr/include/boost/noncopyable.hpp:27:7:エラー: 'boost :: noncopyable _ :: noncopyable :: noncopyable(const boost :: noncopyable _ :: noncopyable&)'はプライベートtest.cc:6:30:エラー:このコンテキスト内test.cc:関数'int main()': test.cc:20:12:注:ここで最初に必要な合成メソッド'T :: T(const T&)'
注:C ++ 11の移動機能は、C ++ 11をサポートしていない比較的古いバージョンのgccでコンパイルできる必要があるため、私にはオプションではありません。
C ++ 11のサポートがないため、「良い」解決策があるかどうかはわかりません。しかし、私は私が尋ねると思いました。