【发布时间】:2019-11-04 22:03:59
【问题描述】:
考虑:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
foo 的内容现在有效吗?还是我需要显式循环并初始化它们?我已经检查过 Godbolt,它似乎很好,但是在这一点上标准似乎很混乱。
std::vector 构造函数说它插入了std::atomic<int> 的default-inserted 实例,这些实例是value initialised 通过放置new。
我认为值初始化的这种效果适用:
2) 如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(也就是说,它可能是具有隐式定义或默认构造函数的类),则该对象为零初始化并且如果它有一个非平凡的默认构造函数,那么它是默认初始化的;
所以在我看来,原子是零初始化的。那么问题来了,std::atomic<int> 的零初始化是否会产生一个有效的对象?
我猜答案是“在实践中是的,但它并没有真正定义”?
注意:This answer 同意它是零初始化的,但并没有真正说明这是否意味着该对象是有效的。
【问题讨论】: