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