将具有不可复制字段的对象插入 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>
,你就不会得到这个错误。
我了解到以下代码无法编译,因为 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>
,你就不会得到这个错误。