У выражений должен быть тип, известный во время компиляции. Вы не можете иметь выражения типа "или X или Y", это должно быть одно или другое.
Рассмотрим этот случай:
void f(int x) {...}
void f(const char* str) {...}
f(condition ? 5 : "Hello");
Какая перегрузка будет вызвана? Это простой случай, и есть более сложные случаи, включающие, например, шаблоны, которые должны быть известны во время компиляции. Таким образом, в приведенном выше случае компилятор не будет выбирать перегрузку в зависимости от условия, он должен выбрать one overload, чтобы всегда вызывать.
Он не может этого сделать, поэтому результат троичного оператора всегда должен быть одного типа (или совместимым).