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


