无法将含std::mutex成员的对象存入vector:求替代解决方案
解决包含std::mutex的结构体无法存入std::vector的问题
原代码报错的核心原因是std::mutex的拷贝构造、拷贝赋值运算符被显式删除,结构体S因为包含该成员,默认的拷贝构造/赋值操作也被隐式删除,而push_back需要将临时对象拷贝进vector,因此触发错误。以下是两种无需编写拷贝构造函数的解决方案:
方案1:用emplace_back原地构造对象
emplace_back可以直接在vector的内存空间里调用S的构造函数,完全跳过临时对象的创建和拷贝/移动步骤,完美适配包含不可拷贝成员的类型,而且不需要修改结构体S的任何代码。
修改后的代码:
#include <vector> #include <mutex> struct S { S() = default; S(int a, double b, char c) : a_(a), b_(b), c_(c){} std::mutex mutex_; int a_; double b_; char c_; // + Many more class members }; int main() { std::vector<S> vec; // 直接在vector内部构造对象,无需临时对象拷贝 vec.emplace_back(6, 6.7, 'f'); }
方案2:使用智能指针容器存储对象
如果需要先在别处构造S对象再加入容器,可以改用std::vector<std::unique_ptr<S>>,将S对象放在堆上,容器中存储可移动的智能指针,这样就不会涉及S本身的拷贝或移动操作。
示例代码:
#include <vector> #include <mutex> #include <memory> struct S { S() = default; S(int a, double b, char c) : a_(a), b_(b), c_(c){} std::mutex mutex_; int a_; double b_; char c_; // + Many more class members }; int main() { std::vector<std::unique_ptr<S>> vec; // 构造对象并移动到容器中 vec.push_back(std::make_unique<S>(6, 6.7, 'f')); // 用emplace_back更高效,避免智能指针的移动 vec.emplace_back(std::make_unique<S>(6, 6.7, 'f')); }
注意访问容器内的对象时需要通过指针(比如vec[0]->a_),但这种方式能灵活管理对象的生命周期。
内容的提问来源于stack exchange,提问作者rare77
相关产品推荐
相关产品推荐

