鉴于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中添加)之间的争论。
关于c++ - 为什么必须在std::array<SomeStruct, size> in C++初始化时为每个项目指定类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58945571/