C++ 使用默认值初始化std::array

C++ 使用默认值初始化std::array,c++,arrays,initialization,C++,Arrays,Initialization,我偶然发现了std::array的一个奇怪行为。一些容器,如std::vector初始化所有单元格,使得int的向量在默认情况下将是一个充满零的向量。我测试了std::array是否也是如此。我发现了两件事: 1) 看起来大多数细胞都在进行初始化(但可能还有其他原因),有些细胞没有 2) 未初始化的单元格总是相同的。这在程序的不同执行之间以及不同编译之间都适用。考虑下面的输出。对于此代码: std::array<int, 100> a; for (auto x : a) std::c

我偶然发现了
std::array
的一个奇怪行为。一些容器,如
std::vector
初始化所有单元格,使得
int
的向量在默认情况下将是一个充满零的向量。我测试了
std::array
是否也是如此。我发现了两件事:

1) 看起来大多数细胞都在进行初始化(但可能还有其他原因),有些细胞没有

2) 未初始化的单元格总是相同的。这在程序的不同执行之间以及不同编译之间都适用。考虑下面的输出。对于此代码:

std::array<int, 100> a;
for (auto x : a) std::cout << x << " ";

std::array
的构造函数按照聚合初始化规则初始化数组(请注意,默认初始化可能会导致非类T的值不确定)

请检查
构造函数

由于
int
非类
因此
a
数组中元素的值是
不确定的
,因此它们可能只是位于分配给
a
元素的位置的垃圾。这就是为什么你有时会看到不同的结果


简而言之,这是一种未定义的行为,因为您正在访问未初始化的变量

看起来像未定义的行为。如果要默认初始化
std::array
,请执行以下操作:

std::array<int, 100> a = {};
std::数组a={};

可能重复否定,这不是我的问题。我对问题投了赞成票,因为我认为否决票是不合理的。OTOH,您应该接受@duong_dajgja的答案,因为这是正确的答案:这些数组值实际上并没有按照常识进行“初始化”:它们只保证对其类型(int)有效,但它们仍然未知。(任何规则性都只是运行时环境的一个偶然特性。)但该模式对于不确定性来说是非常规则的。我猜这个问题的答案在于硬件和驱动程序,那么@lotolmencre Undefined behavior包括似乎有一个模式。试图对未初始化内存的内容进行推理没有多大意义,它实际上是定义的行为:然而,定义说,值本身确实可以是未定义的。(见@duong_dajgja的回答。)
std::array<int, 100> a = {};