Ser*_*eyA 6 c++ initialization atomic language-lawyer c++11
std::atomic<integral_type>变量的0初始化是什么意思?
问题的起源.我有一个函数静态std::array的std::atomic<std::int>,这是我想在第一次使用之前被设置为0(不言而喻,其中所述阵列位于被称为在从多个线程不可预测的方式功能).
这段代码很好看,但由于原子是非拷贝可构造的,所以没有编译:
#include <array>
#include <atomic>
void foo() {
using t = std::atomic<int>;
static std::array<t, 2> arr = {0, 0}; // <-- explicit, but errors out (see below)
static std::array<t, 2> arr2; // <-- implicit?, works
}
Run Code Online (Sandbox Code Playgroud)
错误:使用已删除的函数'std :: atomic :: atomic(const std :: atomic&)'std :: array arr = {0,0};
现在,我明白static std::array会初始化它的所有成员,并且std::atomic<>将被初始化为0.但是,我们是否有明确或隐含的保证,它实际上将所有值设置为0?常识说"是" - 毕竟,我们假设该类具有类型的成员int,并且该成员将被初始化为0.但这个假设是基于坚实的标准理由吗?
使用(通常是冗余的)大括号来避免复制初始化:
static t arr[2] = {{0}, {0}};
static std::array<t, 2> arr2 = {{{0}, {0}}}; /* Need extra pair here; otherwise {0} is
treated as the initializer of the internal
array */
Run Code Online (Sandbox Code Playgroud)
演示.省略大括号时,我们是复制初始化,这需要临时创建和复制.使用大括号,我们有copy-list-initialization,其作用与direct-list-initialization相同(即初始化每个元素{0},这很好).
您也可以等到引入保证的副本省略并使用您的语法.