【发布时间】:2015-03-16 01:34:06
【问题描述】:
我有一个NonCopyable 类(由于它的unique_ptr 字段)。我想创建一个 NonCopyable 元素的向量,但以下代码无法编译
NonCopyable nc;
vector<NonCopyable> vec;
vec.push_back(move(nc));
NonCopyable 的定义如下:
class NonCopyable final {
public:
const std::unique_ptr<string> data;
};
错误消息是Call to implicitly-deleted copy constructor of NonCopyable。
如何将 NonCopyable 元素添加到我的向量中,同时能够表明嵌入的数据字段是不可变的?
更新:我目前的解决方案是:(i) make data non-const; (ii) 将其设为私有; (iii) 添加一个 const 函数来公开data。
【问题讨论】:
-
你写过移动构造函数吗?请显示
NonCopyable的定义。 -
不是您问题的答案,但也可以看看
emplace_back,它经常(但并非总是)消除了对push_back和move的需要。 -
就是这样。你做了
unique_ptrconst。如果是 const 则不能移动。 -
@BenjaminLindley 这是由于我的 NonCopyable 定义中的 const 字段。如果我删除 const 修饰符,它会起作用。那我怎么能表明这个字段是不可变的呢?
-
@Fabian:你必须更清楚你所说的不可变是什么意思。因为如果你想让它被移动,那么这种行为就违背了不变性。