为什么我在C++中std::array<SomeStruct, size>的初始化时必须为每个项目指定类型

Why do I have to specify the type for each item at the initialization of std::array<SomeStruct, size> in C++

给定 SomeStruct 如下:

struct SomeStruct {
    int i;
    char c;
};

以下不编译。

int main() {
    std::array<SomeStruct,2> arr = {{3, 't'}, {3, 't'}}; 
}

但下面的代码有效。

int main() {
    std::array<SomeStruct,2> arr = {SomeStruct{3, 't'}, SomeStruct{3, 't'}}; 
}

这个也有效:

int main() {
    std::array<SomeStruct,1> arr = {{3, 't'}}; 
}

为什么这个std::array<SomeStruct,2> arr = {{3, 't'}, {3, 't'}};会导致编译错误?

另外,std::array<SomeStruct,2> arr = {SomeStruct{3, 't'}, SomeStruct{3, 't'}}有没有更简洁的写法? 我不想使用 arr.fill(SomeStruct{3,'t'}) 或循环。我想在初始化时将所有项目设置为相同的 SomeStruct{3, 't'}

根据经验,如果 std::array 初始化似乎不起作用,请继续添加额外的大括号对,直到它起作用为止...

std::array<SomeStruct,2> arr = {{{3, 't'}, {3, 't'}}}; 

这背后的原因和历史悠久而复杂,归结为聚合初始化(C 兼容性的一个缺点)和非聚合列表初始化(C++11 中添加)之间的争论。