【问题标题】:Can't push_back move(NonCopyableWithConstField) to vector无法 push_back 移动(NonCopyableWithConstField)到矢量
【发布时间】: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_backmove 的需要。
  • 就是这样。你做了unique_ptr const。如果是 const 则不能移动。
  • @BenjaminLindley 这是由于我的 NonCopyable 定义中的 const 字段。如果我删除 const 修饰符,它会起作用。那我怎么能表明这个字段是不可变的呢?
  • @Fabian:你必须更清楚你所说的不可变是什么意思。因为如果你想让它被移动,那么这种行为就违背了不变性。

标签: c++ c++11 move


【解决方案1】:

您的NonCopyable 类没有移动构造函数。定义一个。

显示的代码应该可以正常运行。

【讨论】:

  • 刚刚发现问题出在我的 NonCopyable 中的一个字段的 const 修饰符上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多