含atomic成员的多成员类拷贝构造函数被删除,如何存入vector?
不用非得手写全量拷贝构造,给你几个实用的路子:
存智能指针而非对象本身
把vector<YourClass>改成vector<unique_ptr<YourClass>>或者vector<shared_ptr<YourClass>>。这样vector里存的是指向对象的指针,添加元素时用emplace_back(make_unique<YourClass>(构造参数)),完全不会触发类的拷贝构造——毕竟拷贝指针是编译器默认支持的。如果不需要共享所有权,优先用unique_ptr,更轻量;需要多地方共享对象就用shared_ptr。给类加默认移动构造(C++20及以上适用)
std::atomic在C++20开始支持移动操作,只要你的类里没有手动声明拷贝构造、拷贝赋值或析构函数,可以直接让编译器生成默认移动构造:class YourClass { // ... 你的成员(包括atomic类型成员) public: YourClass(YourClass&&) = default; YourClass& operator=(YourClass&&) = default; };之后往vector里加元素时用
push_back(std::move(your_obj))或者直接emplace_back构造新对象,vector扩容时会用移动而非拷贝,避开拷贝构造被删除的问题。把atomic包装成可拷贝的共享对象(按需使用)
如果业务允许多个类实例共享同一个atomic的状态,把std::atomic<T>成员换成std::shared_ptr<std::atomic<T>>。这样拷贝类实例时,只是拷贝shared_ptr(指向同一个atomic对象),编译器就能自动生成拷贝构造函数,不用你手动编写全量拷贝逻辑。但注意这会让多个实例共享同一个atomic值,业务逻辑不允许的话别用这个方案。换用不需要元素移动/拷贝的容器
比如std::list,它在插入元素时不会像vector那样因为扩容而移动已有元素,直接在链表节点里构造新对象即可。但list没有随机访问能力,如果你的场景不需要快速下标访问,可以考虑换用它。
内容的提问来源于stack exchange,提问作者intrigued_66

