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

Inserting an object having a non copyable field into an std::vector

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

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

  private:
    std::mutex m;

};


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

但是如果我想将我的 A 存储在标准容器中,我应该怎么做呢?我对 A 正在构造 "inside" 容器很好。

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

如果你使用,比如说,std::list<A>,你就不会得到这个错误。