如何初始化 std::array<std::atomic<bool>> — 没有复制或移动 ctors

How to initialize std::array<std::atomic<bool>> — no copy or move ctors

在我的 class 中,我想要一个 std::array<std::atomic<bool>>,我想在构造函数中通过成员初始化来初始化它。

例如:

struct Foo {

    Foo()
    : flags{{
        true,
        true
    }}
    { /* no op */ }
    std::array<std::atomic<bool>, 2> flags;
};

遗憾的是,这不起作用,给出:error: use of deleted function 'std::atomic<bool>::atomic(const std::atomic<bool>&)'

这是有道理的,因为std::atomic<bool>既不可复制也不可移动。

所以,不知何故,我需要直接初始化这两个标志。

但是它的语法是什么?

这是一个实时代码link:https://godbolt.org/z/fEsfaWGcn

您可以为 std::array 的初始化列表中的每一项使用一个初始化列表。方法如下:

struct Foo {
    Foo()
    : flags{{
        {true},
        {true}
    }}
    { /* no op */ }
    std::array<std::atomic<bool>, 2> flags;
};

虽然语法有点奇怪,但效果很好(在 GCC、Clang、MSVC 和 ICC 上测试过)。