Почему C++ не позволяет неявную инициализацию списка в условном операторе?
Этот код компилируется:
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 : {};
}
Учитывая, что оба значения результата оператора ?:
Должны быть одного типа, почему он не выводит тип, как в первом примере?
Похоже, что этот вопрос может иметь аналогичный ответ на этот вопрос (который по сути сводится к "потому что никто не думал об этом при написании спецификации языка"). Однако я все еще считаю полезным сохранить этот вопрос, так как сам вопрос отличается, он все еще достаточно удивителен, и другой не будет искать эту проблему.
Ответы
Ответ 1
Инициализатор в скобках не является выражением и поэтому не имеет типа. Увидеть:
https://scottmeyers.blogspot.com/2014/03/if-braced-initializers-have-no-type-why.html
Инициализатор в скобках - это грамматическая конструкция со специальными правилами в стандарте, явно указывающая разрешенное использование и вывод типов. Эти специальные правила необходимы именно потому, что инициализированные скобки не имеют типа. Использование их в операторах ?:
Не указано, и, следовательно, программа некорректна.
Если вам действительно нужно услышать, как сам человек сказал это три раза подряд, прежде чем поверить в это, тогда:
https://youtu.be/wQxj20X-tIU?t=1792