Тернарный оператор - PullRequest
3 голосов
/ 14 января 2011

Есть ли логическая причина, объясняющая, почему в тройном опторе обе ветви должны иметь одинаковый базовый тип или быть конвертируемыми в один? В чем проблема отсутствия этого правила? С какой стати я не могу делать такие вещи (это не лучший пример, но проясняет, что я имею в виду):

int var = 0;

void left();
int right();

var ? left() : right();

Ответы [ 4 ]

13 голосов
/ 14 января 2011

У выражений должен быть тип, известный во время компиляции. Вы не можете иметь выражения типа "или X или Y", это должно быть одно или другое.

Рассмотрим этот случай:

void f(int x) {...}
void f(const char* str) {...}

f(condition ? 5 : "Hello");

Какая перегрузка будет вызвана? Это простой случай, и есть более сложные случаи, включающие, например, шаблоны, которые должны быть известны во время компиляции. Таким образом, в приведенном выше случае компилятор не будет выбирать перегрузку в зависимости от условия, он должен выбрать one overload, чтобы всегда вызывать.

Он не может этого сделать, поэтому результат троичного оператора всегда должен быть одного типа (или совместимым).

6 голосов
/ 14 января 2011

Тернарный оператор возвращает значение ветви, которую он принимает.Если две ветви не имеют одинаковый тип, выражение будет иметь неопределенный тип.

1 голос
/ 14 января 2011

Дело в том, что выражение должно иметь статически определенный тип.

Если ветви вашего троичного оператора несовместимы, вы не можете статически вывести тип троичного выражения.

0 голосов
/ 14 января 2011

Я думаю, потому что троичный оператор должен иметь определенное возвращаемое значение. Трудно сделать, если типы обеих ветвей различны или недействительны.

...