我正在尝试创建一个包含类实例的 vector ,该类实例又包含(除其他外)std::atomic。
我试过几种:
- 如果没有指定拷贝构造函数,编译器会报错构造函数被删除。
如果指定了复制构造函数,我尝试了两种方法:
对于 foo(foo& other) 它将提示没有找到 foo 的复制构造函数。
编辑:复制构造函数是 foo(foo& other) : atomic(other.atomic.load()) {}
使用 foo(const foo& other) 会提示 std::atomic 没有常量复制构造函数。
编辑:复制构造函数是 foo(const foo& other) : atomic(other.atomic.load()) {}
我完全不知道如何解决这个问题,所以非常感谢您的帮助
最佳答案
std::atomic
根据设计,既不可复制也不可移动。在 std::vector
上的操作这导致它重新分配要求其元素至少是可移动的。因此,您有以下选择:
- 停止存储
std::atomic
在元素类中。也许是std::unique_ptr<std::atomic>
可以改用。 - 停止将元素类直接存储在 vector 中,存储
std::unique_ptr<ElementClass>
相反(正如@Richard Critten 在评论中所建议的那样)。 - 为您的类编写复制或移动构造函数和赋值运算符,这将以某种方式解决
std::atomic
的不可移动性问题. 为您的类提供虚拟复制/移动操作以满足编译器的要求。然后,使用
reserve
在 vector 中预分配空间,然后只使用追加元素(直到预先分配的大小)、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。鉴于这种方法的脆弱性,我建议采取两种预防措施:
- 让假人 throw ,以便您尽快发现任何违反“不调整大小”要求的行为。
- 不要使用
std::vector
直接,但将其包装在您自己的NonResizableVector<T>
中具有适当限制的界面,并对其进行大量记录。
您应该(甚至可以)使用其中的哪一个取决于您的类(class)实际做什么。
关于c++ - 包含原子的类的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331210/