【发布时间】:2012-09-04 18:36:29
【问题描述】:
我希望创建一种类型,该类型可以使用其他类型的赋值进行初始化,但不能复制。这个想法类似于作用域智能指针,因为我希望这种类型的对象在其生命周期内拥有资源,但我也希望能够使用赋值语法。所以总而言之,这就是我想要的:
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 的支持,我不确定是否有“好的”解决方案。但我想我会问。
【问题讨论】:
-
只需将复制构造函数设为私有即可。
-
@Chris:您还没有阅读我的问题,复制构造函数已经 是 私有的。这就是
boost::noncopyable所做的。我需要它是不可复制的,但我也希望它可以用赋值语法初始化。 -
T y = xwherexis not aTis the same asT y(T(x))IIRC (notT y(x)),所以你必须有如果你想允许这个 pre C++11,则复制构造函数 public -
Seth 是正确的,
T x = y;是 复制初始化 的特定语法(顺便说一句,与赋值无关没有)。跨度> -
@eq- 即使发生复制省略,复制构造函数也必须是可访问的,编译器优化不能规避语言规则
标签: c++