Почему 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