如何将新实例化的std::mutex存入std::vector<std::mutex>容器?
如何将std::mutex存入std::vectorstd::mutex?
报错原因
std::mutex是不可拷贝、不可移动的类型——它的拷贝构造函数和移动构造函数都被显式删除了。std::vector的push_back操作在内部可能触发元素的拷贝或移动(比如vector扩容时需要重新分配内存、迁移现有元素),哪怕使用std::move,也会因std::mutex没有合法的移动构造逻辑而报错。
可行解决方案
1. 存储智能指针(推荐)
用std::unique_ptr<std::mutex>包装mutex,将指针存入vector。unique_ptr支持移动语义,可以安全放入vector:
#include <vector> #include <mutex> #include <memory> int main() { std::vector<std::unique_ptr<std::mutex>> mutex_vec; // 直接构造并插入 mutex_vec.push_back(std::make_unique<std::mutex>()); // 用emplace_back更高效 mutex_vec.emplace_back(std::make_unique<std::mutex>()); }
2. 使用std::optional(C++17及以上)
std::optional可以容纳不可移动但可默认构造的类型,通过emplace_back结合std::in_place直接在vector内存中构造mutex:
#include <vector> #include <mutex> #include <optional> int main() { std::vector<std::optional<std::mutex>> mutex_vec; // 直接在vector的内存空间中构造mutex mutex_vec.emplace_back(std::in_place); }
3. 提前预留空间并原地构造(局限性大)
如果能确定vector的最终大小,提前用reserve预留足够内存避免后续扩容,再用emplace_back原地构造mutex。但一旦后续添加元素超过预留空间,vector扩容时仍会因无法移动mutex而报错:
#include <vector> #include <mutex> int main() { std::vector<std::mutex> mutex_vec; mutex_vec.reserve(3); // 提前预留3个元素的空间 // 原地构造mutex,不会触发拷贝/移动 for (int i = 0; i < 3; ++i) { mutex_vec.emplace_back(); } }
内容的提问来源于stack exchange,提问作者Rahn
相关产品推荐
相关产品推荐

