You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将新实例化的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:06:07