C++中如何初始化vector<array<char,5>>?对应编译报错该怎么解决
问题根因
你遇到的是GCC 5.4版本的C++11标准实现的已知缺陷:该版本对嵌套聚合类型的花括号初始化列表推导支持不完善。
- 单个
std::array<char,5>是聚合类型,{"sdfd"}可以直接匹配聚合初始化规则,所以编译正常。 - 你写的
vector<array<char,5>> s1{{"asdf"}}语法本身符合C++11标准的语义,意图是用"asdf"构造一个array<char,5>实例,再放入vector的初始化列表中,但GCC 5.4无法自动完成两层嵌套下的类型推导,因此报错找不到匹配的构造函数。
修复方案
以下三种写法都可以在GCC 5.4 -std=c++11 环境下正常编译:
- 显式构造
std::array实例,避免编译器推导
std::vector<std::array<char, 5>> s1{std::array<char,5>{"asdf"}};
如果需要保留双层花括号的写法,也可以写成:
std::vector<std::array<char, 5>> s1{{std::array<char,5>{"asdf"}}};
- 补全三层花括号适配老版本GCC的推导规则
最外层花括号对应vector的初始化列表,第二层对应初始化列表内的array元素,第三层对应array本身的聚合初始化:
std::vector<std::array<char, 5>> s1{{{"asdf"}}};
- 如果需要初始化多个array元素,显式写出每个元素的构造也可以正常工作:
std::vector<std::array<char, 5>> s1{ std::array<char,5>{"asdf"}, std::array<char,5>{"qwer"} };
注:该问题在GCC 7及以上版本已经修复,你的原始写法
vector<array<char, 5>> s1{{"asdf"}}在高版本GCC的C++11及更高标准下可以直接正常编译。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

