假设我有一个成员数组为std::atomic
s的类,其中
数组通过计算确定大小(即它可能会根据程序中其他地方的其他常数而改变):
class Foo {
static constexpr size_t kArraySize = ComputeArraySize();
std::atomic<size_t> atomics_[kArraySize];
};
确保原子都被初始化为最优雅的方法是什么?
零?我可以做的比在Foo
的构造函数中循环数组更好
明确存储零? std::array
答案是否有所不同?
通常我会在这里使用一个大括号初始化器,但是派生的长度(哪个 可能很长)使其变得困难。
请注意,我不能假设Foo
的实例具有静态存储
持续时间。
答案 0 :(得分:11)
好的,我相信我已经完成了这项工作。这两个都将初始化所有 原子论为零:
std::atomic<size_t> plain_array[kArraySize] = {};
std::array<std::atomic<size_t>, kArraySize> std_array = {};
这是逻辑:
[dcl.init.aggr] / 1将数组定义为聚合。
[array.cons] / 1强制要求std::array
也是聚合。
[dcl.init.aggr] / 7表示如果初始化程序的元素较少 列表比聚合中的成员,然后是其余成员 应从空的初始化列表初始化。在这种情况下,那是 所有成员。
[dcl.init.list] / 3定义了一个类的空列表中的列表初始化
使用默认构造函数(与std::atomic
一样)来导致
值初始化。
[dcl.init] / 7表示没有用户提供的构造函数的类是
零初始化。假设std::array<T>
包含T
数组,
并且std::atomic<size_t>
的零表示符合我们的预期,
那我们很好。
现在,std::atomic
确实拥有一个用户提供的构造函数,而不是一个
用户提供的默认构造函数(后者明确默认)。所以
它在技术上不符合最后一点的条件。但似乎这样
标准中为error,最近为fixed
草稿。