Zer*_*30o 1 c++ copy vector atomic copy-constructor
我正在尝试创建一个包含类实例的向量,该类实例又包含(除其他外)std::atomic。
我已经尝试过以下几种:
如果指定了复制构造函数,我尝试了两件事:
对于 foo(foo& other) ,它会抱怨没有找到 foo 的复制构造函数。
编辑:复制构造函数是 foo(foo& other) :atomic(other.atomic.load()) {}
对于 foo(const foo& other) ,它会抱怨 std::atomic 没有 const 复制构造函数。
编辑:复制构造函数是 foo(const foo& other) :atomic(other.atomic.load()) {}
我完全不知道如何解决这个问题,所以非常感谢任何帮助
std::atomic根据设计,不可复制或可移动。导致其重新分配的操作std::vector要求其元素至少是可移动的。因此,您有以下选择:
std::atomic在元素类中。也许std::unique_ptr<std::atomic>可以用 a 代替。std::unique_ptr<ElementClass>而是存储(如 @Richard Critten 在评论中建议的那样)。std::atomic.为您的类提供虚拟复制/移动操作以满足编译器的要求。然后,使用 预先分配向量中的空间reserve,然后仅使用附加元素(最多达到预先分配的大小)、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。
鉴于这种方法的脆弱性,我建议采取两项预防措施:
std::vector直接使用,而是NonResizableVector<T>使用适当限制的接口将其包装在您自己的中,并对其进行大量记录。您应该(甚至可以)使用其中哪一个取决于您的班级实际做什么。