构造一个“std::array”,其中包含的元素少于其可以容纳的元素?

Constructing a `std::array` with braces containing fewer elements than it can hold?

提问人:Ben 提问时间:7/11/2023 最后编辑:EvgBen 更新时间:7/11/2023 访问量:86

问:

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

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

相关:

C++ 语言律师 stdarray

评论


答:

7赞 HolyBlackCat 7/11/2023 #1

聚合初始化零(确切地说是值初始化)没有初始值设定项的元素。

[dcl.init.aggr]/5.2

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

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

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

— 否则,程序格式不正确。