三元运算符

时间:2011-01-14 16:52:48

标签: c++ ternary-operator

是否有任何合理的理由可以解释为什么在三元optor中两个分支必须具有相同的基类型或可以转换为一个?没有这个规则有什么问题?为什么我不能做这样的事情(这不是最好的例子,但澄清了我的意思):

int var = 0;

void left();
int right();

var ? left() : right();

4 个答案:

答案 0 :(得分:13)

表达式必须在编译时具有已知类型。你不能有“X或Y”类型的表达式,它必须是一个或另一个。

考虑这种情况:

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

f(condition ? 5 : "Hello");

将调用哪个重载?这是一个简单的案例,有更复杂的案例涉及例如模板,必须在编译时知道。所以在上面的例子中,编译器不会根据条件选择重载,它必须选择一个重载来始终调用。

它不能这样做,因此三元运算符的结果必须是相同类型(或兼容)。

答案 1 :(得分:6)

三元运算符返回它所采用的分支的值。如果两个分支都不具有相同的类型,则表达式将具有不确定的类型。

答案 2 :(得分:1)

关键是表达式应该具有静态定义的类型。

如果三元运算符的分支不兼容,则无法静态推导出三元表达式类型。

答案 3 :(得分:0)

我猜因为三元运算符必须有一个定义的返回值。如果两个分支的类型不同或无效,则很难做到。