【发布时间】:2013-06-06 06:19:51
【问题描述】:
在 C++11 中是否可以有没有可复制对象(具有引用实例)的 std::vector ?
struct CanNotCopy {
int& intref_;
CanNotCopy(int& i) noexcept : intref_(i) {}
// How do I make move constructor and operator = ?
};
std::vector<CanNotCopy> hoge; // OK
hoge.resize(10); // default constructor required
int j = 123;
hoge[1] = CanNotCopy(j); // copy constructor required
【问题讨论】:
-
如果对象可以移动就足够了。但是,
CanNotCopy类既不是 copyable 也不是 movable,因此它不能用作std::vector的元素类型。 -
另外,如果你没有默认构造函数(注意不可移动类当然可以有默认构造函数;但是你的类没有),你必须告诉
resize如何构造新的对象。不幸的是,这样做的唯一方法是将对象提供给 copy ,因此您不能将resize与既不是默认构造也不是复制构造的类一起使用。 -
澄清一下,
CanNotCopy类型既可以复制构造也可以移动构造。第二个有问题的行要求类型是可移动的。引用成员会干扰赋值运算符,但不会干扰复制和移动构造函数。 (不可分配确实会阻止该类型被视为可复制或可移动。)