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

无法将含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:35:28