鉴于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/

10-11 21:06