使用大括号构造一个“std::array”,其中包含的元素少于它所能容纳的元素?

Ben*_*Ben 2 c++ language-lawyer stdarray

如果我std::array<T, N>用大括号构造 a 并给它少于N项目,那么这些项目是否为零初始化?(或者它们是否保留默认初始化?)如果我给它零个项目(即= {}),那么我相信它会将所有元素零初始化。

我找不到这个简单问题的明确答案。由于std::array在像 一样使用时使用聚合初始化std::array<int, 2> x = { 1 };,因此导致聚合初始化规则的https://en.cppreference.com/w/cpp/language/aggregate_initialization 。在那里,我看到的关于这种情况的唯一提及是“如果指定了数组的大小并且它大于字符串文字中的字符数,则其余字符将被零初始化。” 但这是在“字符数组”部分中,所以看起来通常不是这样。另一方面,用作constexrpUB 检测器表明它们已归零: https: //godbolt.org/z/zE9xKvbrq

有关的:

Hol*_*Cat 7

聚合初始化将没有初始化器的元素归零(准确地说是值初始化)。

\n

[dcl.init.aggr]/5.2

\n
\n

对于非联合聚合,每个不是显式初始化元素的元素都按如下方式初始化:

\n

\xe2\x80\x94 如果元素具有默认成员初始值设定项 ([class.mem]),则从该初始值设定项初始化该元素。

\n

\xe2\x80\x94 否则,如果元素不是引用,则从空初始值设定项列表 ([dcl.init.list]) 复制初始化该元素。

\n

\xe2\x80\x94 否则,程序格式错误。

\n
\n