Ternary operator

2019-01-26 19:32发布

问题:

Is there any logical reason that will explain why in ternary optor both branches must have the same base type or be convertible to one? What is the problem in not having this rule? Why on earth I can't do thing like this (it is not the best example, but clarifies what I mean):

int var = 0;

void left();
int right();

var ? left() : right();

回答1:

Expressions must have a type known at compile time. You can't have expressions of type "either X or Y", it has to be one or the other.

Consider this case:

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

f(condition ? 5 : "Hello");

Which overload is going to be called? This is a simple case, and there are more complicated ones involving e.g. templates, which have to be known at compile time. So in the above case, the compiler won't choose an overload based on the condition, it has to pick one overload to always call.

It can't do that, so the result of a ternary operator always has to be the same type (or compatible).



回答2:

The ternary operator returns the value of the branch it takes. If the two branches didn't both have the same type, the expression would have an indeterminate type.



回答3:

The point is that an expression should have a statically defined type.

If branches of your ternary operator are incompatible, you cannot statically deduce the ternary expression type.



回答4:

I guess because the ternary operator must have a defined return value. Hard to do if the types of both branches is different, or void.