Skip to main content
 首页 » 编程设计

c++之为什么我必须在 C++ 中的 std::arraySomeStruct, size> 初始化时为每个项目指定类型

2025年12月25日40lyhabc

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