将具有不可复制字段的对象插入到std :: vector中

时间:2016-10-14 18:29:28

标签: c++ c++11 vector noncopyable emplace

我理解以下代码无法编译,因为A的移动构造函数被删除,因为互斥锁不可移动。

class A {
  public:
    A(int i) {}

  private:
    std::mutex m;

};


int main() {    
    std::vector<A> v;
    v.emplace_back(2);
}

但是如果我希望我的A存储在std容器中,我应该怎么做呢?我很好A正在构建&#34;内部&#34;容器。

1 个答案:

答案 0 :(得分:3)

std::vector::emplace_back可能需要增加向量的容量。由于向量的所有元素都是连续的,这意味着将所有现有元素移动到新分配的存储。因此,实现emplace_back的代码通常需要调用移动构造函数(即使对于具有空向量的情况,它也会调用它为零次。)

如果您使用std::list<A>,则不会出现此错误。