根据ISO / IEC 14882:2011,我们不能在三元运算符的第二和第三个操作数中使用throw-expression:
5.16条件运算符[expr.cond]
2如果第二个或第三个操作数的类型为void,则为 lvalue-to-rvalue(4.1),array-to-pointer(4.2)和 函数到指针(4.3)标准转换是在 第二和第三个操作数,以下之一应该成立: - 第二个或第三个操作数(但不是两个)是一个throw-expression (15.1);结果是另一个的类型,是一个prvalue。 - 第二个和第三个操作数都有类型void;结果是 类型为void,是一个prvalue。 [注意:这包括的情况 两个操作数都是throw-expressions。 - 后注]
为什么Comeau编译器和gcc都允许使用此代码?
int main()
{
true ? throw 0 : throw 1;
}
答案 0 :(得分:2)
仔细阅读,标准不禁止它,它甚至在注释中引用它。