我正在寻找一种可以使用其他类型的赋值来初始化但不能复制的类型。这个想法类似于作用域智能指针,因为我希望这种类型的对象在其生命周期内拥有资源,但我也希望能够使用赋值语法。所以在概要中,这就是我想要的:
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 支持,我不确定是否有“好的”解决方案。但我想我会问。