是否有任何合理的理由可以解释为什么在三元optor中两个分支必须具有相同的基类型或可以转换为一个?没有这个规则有什么问题?为什么我不能做这样的事情(这不是最好的例子,但澄清了我的意思):
int var = 0;
void left();
int right();
var ? left() : right();
答案 0 :(得分:13)
表达式必须在编译时具有已知类型。你不能有“X或Y”类型的表达式,它必须是一个或另一个。
考虑这种情况:
void f(int x) {...}
void f(const char* str) {...}
f(condition ? 5 : "Hello");
将调用哪个重载?这是一个简单的案例,有更复杂的案例涉及例如模板,必须在编译时知道。所以在上面的例子中,编译器不会根据条件选择重载,它必须选择一个重载来始终调用。
它不能这样做,因此三元运算符的结果必须是相同类型(或兼容)。
答案 1 :(得分:6)
三元运算符返回它所采用的分支的值。如果两个分支都不具有相同的类型,则表达式将具有不确定的类型。
答案 2 :(得分:1)
关键是表达式应该具有静态定义的类型。
如果三元运算符的分支不兼容,则无法静态推导出三元表达式类型。
答案 3 :(得分:0)
我猜因为三元运算符必须有一个定义的返回值。如果两个分支的类型不同或无效,则很难做到。