该代码给出了编译器错误:“期望一个表达式”。
std::array< std::string, 3 > candidates = useOutname ? { "%O.log", "%O_.log", "_%O.log" } : { "%J.log", "%J_.log", "_%J.log" };
如果更改为普通的 if else 语句,则它可以起作用:
std::array< std::string, 3 > candidates;
if (useOutname) {
candidates = { "%O.log", "%O_.log", "_%O.log" };
}
else {
candidates = { "%J.log", "%J_.log", "_%J.log" };
}
我想知道为什么使用三元运算符会导致错误?是因为花括号初始化吗?
C++ 中的三元运算符 (?:) 要求真和假分支都是相同类型的表达式。但是{ "%O.log", "%O_.log", "_%O.log" }是一个
braced-init-list
,它不是表达式。这是一种由复制列表初始化处理的特殊语法。因此,你不能像这样在三元运算符中直接使用括号初始化列表……如果您确实想要使用三元运算符的单行代码,那么您可以选择使两个分支成为同一类型的实际表达式,例如: