C++ 如何初始化std::array<;标准::原子<;布尔>&燃气轮机—;不复制或移动复制器

C++ 如何初始化std::array<;标准::原子<;布尔>&燃气轮机—;不复制或移动复制器,c++,stdatomic,stdarray,C++,Stdatomic,Stdarray,在我的类中,我想要一个std::array,我想通过构造函数中的成员初始化来初始化它 例如: struct Foo { Foo() : flags{{ true, true }} { /* no op */ } std::array<std::atomic<bool>, 2> flags; }; structfoo{ Foo() :旗帜{{ 是的, 真的 }} {/*无操作*/} std::数组标

在我的类中,我想要一个
std::array
,我想通过构造函数中的成员初始化来初始化它

例如:

struct Foo {

    Foo()
    : flags{{
        true,
        true
    }}
    { /* no op */ }
    std::array<std::atomic<bool>, 2> flags;
};
structfoo{
Foo()
:旗帜{{
是的,
真的
}}
{/*无操作*/}
std::数组标志;
};
遗憾的是,这不起作用,给出:
错误:使用已删除的函数“std::atomic::atomic(const std::atomic&)”

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

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

但是它的语法是什么


这是一个实时代码链接:

您可以为
std::array
的初始值设定项列表中的每个项目使用初始值设定项列表。以下是如何:

structfoo{
Foo()
:旗帜{{
{true},
{true}
}}
{/*无操作*/}
std::数组标志;
};

虽然语法有点奇怪,但它运行良好(在GCC、Clang、MSVC和ICC上进行了测试)。

天哪,谢谢。我应该知道初始化列表中所有东西的解决方案都是“添加更多花括号”(:我不认为有一种可伸缩的方法来编写它,它不需要你为一个N布尔数组重复N次?@PeterCordes:我怀疑不容易,因为它与原始数组是一样的(例如:
boola[100]={true,true,}
)但是,如果有一些疯狂的模板元编程解决方案我不想去想的话,我也不会感到惊讶……这里也很有趣,在卷曲之前显式地包含类型名是不起作用的,在这种情况下。也就是说,它必须准确地写
{true}
而不是
std::atomic{true}
。让我有点困惑。@jwd:你的第二条评论对我来说很有意义:
{true}
正在初始化数组元素或初始化列表中的命名变量,其中包含
bool
std::atomic{true}
构造一个匿名的
原子的
,然后尝试从中复制构造,这显然是行不通的。