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

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

本文关键字:gt 类型 C++ 项目 size SomeStruct 初始化 std 为什么 lt array      更新时间:2023-10-16

给定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中添加(之间的争用。