C++ 初始化聚合中的原子成员

C++ 初始化聚合中的原子成员,c++,c++14,language-lawyer,stdatomic,aggregate-initialization,C++,C++14,Language Lawyer,Stdatomic,Aggregate Initialization,似乎没有办法使用C++14初始化聚合中的原子成员。以下操作不起作用(): #包括) #包括 #包括 结构构造{ std::atomic_int32_t val_0; std::原子int32值1; }; int main(){ 自动p=新stru{}; std::cout val_01和0不是std::atomic\u int32\ts。以下工作: #include <atomic> #include <iostream> struct stru { std::at

似乎没有办法使用C++14初始化聚合中的原子成员。以下操作不起作用():

#包括)

#包括
#包括
结构构造{
std::atomic_int32_t val_0;
std::原子int32值1;
};
int main(){
自动p=新stru{};

std::cout val_0
1
0
不是
std::atomic\u int32\t
s。以下工作:

#include <atomic>
#include <iostream>

struct stru {
  std::atomic_int32_t val_0;
  std::atomic_int32_t val_1;
};

int main() {
  auto p = new stru{{0}, {1}};
  std::cout << p->val_0 << ", " << p->val_1 << std::endl; 
}
#为初始值设定项列表中的每个元素包括:

每个直接公共…非静态类成员,按照类定义中数组下标/外观的顺序,从初始值设定项列表的相应子句进行复制初始化

在您的示例中,
1
0
被隐式转换为
std::atomic_int32_t
,并且
std::atomic_int32_t
不能从
std::atomic_int32_t
复制初始化
version、
val_0
val_1
是从
std::initializer_list
s复制初始化的,这很好。

Patrick的作品,但他的解释对我来说并不正确。因此我在这里发布了我找到的解释。对于代码
auto p=new stru{{0},{1};
的效果如下:

如果initializer子句是嵌套的大括号init列表(不是 表达式),对应的数组元素/类成员/public base(自C++17起)是从该子句初始化的列表:aggregate 初始化是递归的


因此,不是复制初始化,而是从带括号的初始化列表中初始化复制列表。

不要发布指向编译器spew的链接,而是发布spew。您的第一个代码块在VS2017上编译时没有警告/错误,并按预期运行。我缺少什么吗?@jwdonahue如果不同的编译器不一致,那么其中一个必须是正确的ct而另一个可能是错误的。VS被认为是不符合标准的。顺便说一句,你发布spew是什么意思?他的意思是把错误信息放在问题中。你尝试过VS选项来指定你想要的语言版本吗?:-)你能解释一下这里发生的事情的细节吗?我认为你的解释不正确。我已经发布了解释我发现的国家。相关::如果您正在编写自定义构造函数(常规构造函数或(可能是个坏主意)复制构造函数):一定要使用
:atomic_成员(a)
语法将参数传递给
std::atomic
构造函数,而不是使用原子存储(赋值)在让一个原子成员默认初始化后,在构造函数内部。@PeterCordes确实如此。但是,我有点担心
原子标记
。似乎只有
std::atomic_flag v=atomic_flag_INIT;
语法才能保证工作(请参阅)。因此,我想知道
:atomic_成员(a)
可以,或者我必须使用类内默认成员初始值设定项。我说的是
std::atomic
模板;
std::atomic_标志
被标准允许不同,我想因为它是唯一保证无锁的。
:atomic_成员(a)
绝对可以并且对于典型的C++实现,代码是不可忽略的,例如<代码> int >代码> >代码>长< /COD>和其他小<代码> t>代码>类型。(它可能在不需要特殊且定义在
std::atomic
之上的实现上编译;标准允许它特殊。)当您说“成员是从带括号的init列表复制初始化的”--在这种情况下选择了哪个构造函数?@PatrickCollins这意味着如果所选构造函数被声明为
explicit
,则程序的格式不正确。例如,
unique\u ptr p={new int()}
将不会编译。
error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
   auto p = new stru{0, 1};
                     ^
#include <atomic>
#include <iostream>

struct stru {
  std::atomic_int32_t val_0;
  std::atomic_int32_t val_1;
};

int main() {
  auto p = new stru{};
  std::cout << p->val_0 << ", " << p->val_1 << std::endl; 
}
#include <atomic>
#include <iostream>

struct stru {
  std::atomic_int32_t val_0;
  std::atomic_int32_t val_1;
};

int main() {
  auto p = new stru{{0}, {1}};
  std::cout << p->val_0 << ", " << p->val_1 << std::endl; 
}