此代码编译:
std::string f(bool a, std::string const& b)
{
if (a) return b;
return {};
}
此代码还可以编译:
std::string f(bool a, std::string const& b)
{
return a ? b : std::string{};
}
此代码无法编译:
std::string f(bool a, std::string const& b)
{
return a ? b : {};
}
考虑到?:
运算符的两个结果值必须为同一类型,为什么不像在第一个示例中那样推论该类型?
该问题似乎与this有相似的答案(本质上可以归结为“因为在编写语言规范时没有人考虑过它”)。但是,我仍然认为保留该问题是有用的,因为问题本身是不同的,这仍然足够令人惊讶,并且在搜索该问题时不会出现其他问题。
答案 0 :(得分:6)
支撑初始化器不是表达式,因此没有类型。参见:
https://scottmeyers.blogspot.com/2014/03/if-braced-initializers-have-no-type-why.html
支撑初始化程序是标准中带有特殊规则的语法构造,显式指定允许的使用和类型推导。正是因为支撑初始化器没有类型,才需要这些特殊规则。未指定在?:
语句中使用它们,因此程序格式错误。
如果您真的需要在听到自己的声音之前先听到他自己说三遍,那么: