投掷三元运算符

时间:2015-11-30 16:05:47

标签: c++

编译:

struct A{};
struct B{};

int main(){
  if(true)
    throw A();
  else
    throw B();  
}

,但是

struct A{};
struct B{};

int main(){
  throw( true ?  A() : B() );
}

赢得'吨

我可以使用三元运算符吗?

3 个答案:

答案 0 :(得分:7)

AB是不同的,不兼容的类型,因此表达式true ? A() : B()是错误类型的(它必须是A或者B { [Error: Command failed: identify: unable to open image `����': No such file or directory @ error/blob.c/OpenBlob/2701. identify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501. ] code: 1, signal: null } )。

答案 1 :(得分:2)

三元运算符需要在两个路径上具有相同的类型(或可转换为相同类型的东西),否则编译器无法推断类型安全性。

答案 2 :(得分:0)

如果条件运算符有结果,则类型需要以某种方式兼容。如果类型不兼容,你仍然可以从三元运算符抛出:

condition? throw A(): throw B();

虽然我尝试的所有编译器都编译了上述语句,但它似乎是非法的:根据5.16 [expr.cond]第2段,第一个子弹"第二个或第三个操作数(但不是两个)是一个(可能带括号)throw-expression(15.1); ...&#34 ;.为了抵消这种限制,可以使用像

这样的东西
condition? (throw A()), true: throw B()