编译:
struct A{};
struct B{};
int main(){
if(true)
throw A();
else
throw B();
}
,但是
struct A{};
struct B{};
int main(){
throw( true ? A() : B() );
}
赢得'吨
我可以使用三元运算符吗?
答案 0 :(得分:7)
A
和B
是不同的,不兼容的类型,因此表达式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()