【发布时间】:2019-10-02 01:16:19
【问题描述】:
这段代码编译:
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 有类似的答案(基本上归结为“因为在编写语言规范时没有人考虑过它”)。但是我仍然认为保留这个问题是有用的,因为问题本身是不同的,它仍然足够令人惊讶,并且另一个不会出现在搜索这个问题。
【问题讨论】:
-
两种类型都需要转换为相同的类型。
{}没有类型。 -
clang 说
{}是一个初始化列表(这里不能使用):godbolt.org/z/imYL6q -
用
std::initializer_list<char>()替换{}也可以编译。 -
也许这个问题可以变成语言提案
-
@miral:正确的术语是“列表初始化”。这就是标准所说的;你不会在标准中找到关于“统一初始化”的任何内容。
标签: c++ c++11 language-lawyer conditional-operator list-initialization