为什么C ++不允许条件运算符中的隐式列表初始化?

时间:2019-05-15 00:00:47

标签: c++ c++11 language-lawyer conditional-operator list-initialization

此代码编译:

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有相似的答案(本质上可以归结为“因为在编写语言规范时没有人考虑过它”)。但是,我仍然认为保留该问题是有用的,因为问题本身是不同的,这仍然足够令人惊讶,并且在搜索该问题时不会出现其他问题。

1 个答案:

答案 0 :(得分:6)

支撑初始化器不是表达式,因此没有类型。参见:

https://scottmeyers.blogspot.com/2014/03/if-braced-initializers-have-no-type-why.html

支撑初始化程序是标准中带有特殊规则的语法构造,显式指定允许的使用和类型推导。正是因为支撑初始化器没有类型,才需要这些特殊规则。未指定在?:语句中使用它们,因此程序格式错误。

如果您真的需要在听到自己的声音之前先听到他自己说三遍,那么:

https://youtu.be/wQxj20X-tIU?t=1792