std::vector 个,共 class 个,包含原子

std::vector of class containing atomic

我正在尝试创建一个包含 class 实例的向量,而 class 又包含(除其他外)std::atomic.

我试过几个:

如果指定了复制构造函数,我尝试了两种方法:

我完全不知道如何解决这个问题,所以非常感谢您的帮助

根据设计,

std::atomic 既不可复制也不可移动。对 std::vector 进行重新分配的操作要求其元素至少是可移动的。因此,您有以下选择:

  • 停止在元素 class 中存储 std::atomic。也许可以使用 std::unique_ptr<std::atomic> 代替。
  • 停止将元素 class 直接存储在向量中,而是存储 std::unique_ptr<ElementClass>(正如@Richard Critten 在评论中所建议的那样)。
  • 为您的 class 编写复制或移动构造函数和赋值运算符,这将以某种方式解决 std::atomic.
  • 的不可移动性问题
  • 给你的 class 虚拟 copy/move 操作来满足编译器。然后,使用 reserve 在 vector 中预分配 space,然后仅使用追加元素(直到预分配的大小)、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。

    鉴于这种方法的脆弱性,我建议采取两种预防措施:

    1. 让假人投掷,以便您尽快发现任何违反 "no resizing" 要求的行为。
    2. 不要直接使用 std::vector,而是将其包装在您自己的 NonResizableVector<T> 中并适当限制接口,并大量记录。

你应该(甚至可以)使用其中的哪一个取决于你的 class 实际做了什么。