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