为何三元运算符无法初始化std::array?编译报错原因探究
为什么用三元运算符初始化std::array会报“expected an expression”错误?
核心原因是三元运算符要求两个分支必须是具有明确类型的表达式,而你直接写的{ ... }属于“大括号初始化列表(braced-init-list)”,它本身并不是一个完整的表达式,没有固定类型——编译器无法自动推导这个列表该转换成什么类型来匹配三元运算符的返回值要求,因此抛出“expected an expression”错误。
而在if-else的赋值场景中,编译器已经明确知道目标变量candidates的类型是std::array<std::string, 3>,此时candidates = { ... }属于列表初始化赋值,大括号列表会被直接用作该类型的初始化器,不需要单独推导列表类型,因此可以正常编译。
解决方法
通过显式构造std::array对象,让三元运算符的两个分支拥有明确类型,即可解决编译错误:
方法1:显式构造std::array
std::array<std::string, 3> candidates = useOutname ? std::array<std::string, 3>{ "%O.log", "%O_.log", "_%O.log" } : std::array<std::string, 3>{ "%J.log", "%J_.log", "_%J.log" };
方法2:使用C++20的std::make_array(更简洁)
若编译器支持C++20及以上标准,可借助std::make_array简化代码:
#include <array> std::array<std::string, 3> candidates = useOutname ? std::make_array("%O.log", "%O_.log", "_%O.log") : std::make_array("%J.log", "%J_.log", "_%J.log");
内容的提问来源于stack exchange,提问作者PkDrew
相关产品推荐
相关产品推荐

