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

Mir*_*ral 12 c++ conditional-operator language-lawyer c++11 list-initialization

此代码编译:

std::string f(bool a, std::string const& b)
{
    if (a) return b;
    return {};
}
Run Code Online (Sandbox Code Playgroud)

该代码还可以编译:

std::string f(bool a, std::string const& b)
{
    return a ? b : std::string{};
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译:

std::string f(bool a, std::string const& b)
{
    return a ? b : {};
}
Run Code Online (Sandbox Code Playgroud)

假设?:运算符的两个结果值必须是同一类型,为什么它不像第一个示例中那样推断类型?


看来,这个问题可能有类似的答案,(基本上可以归结为“因为没有人想过写的语言规范时”)。但是,我仍然认为保留该问题很有用,因为问题本身是不同的,这仍然足够令人惊讶,并且其他人不会在搜索此问题时出现。

Nik*_* C. 6

大括号初始化器不是表达式,因此没有类型。看到:

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

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

如果您真的需要听到这个人本人的声音,然后再说三遍,那么您可以:

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

  • @Miral:“ *与任何类型兼容*”不,不是。它是一种语法构造,可以在某些位置用于初始化类型的prvalue。它与任何东西都不“兼容”。 (2认同)
  • @NikosC .:应该注意的是,括号初始列表没有类型,因为它们不是表达式。它们是与表达式截然不同的语法结构。因此,向他们询问类型就像向他们询问其“值”或与表达式相关的任何其他内容。 (2认同)