根据 ISO/IEC 14882:2011,我们不能在三元运算符的第二个和第三个操作数中都使用 throw 表达式:
5.16 条件运算符 [expr.cond]
2 如果第二个或第三个操作数的类型为 void,则在第二个和第三个操作数上执行左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换第三个操作数,并且以下之一应成立: — 第二个或第三个操作数(但不是两者)是 throw 表达式(15.1);结果是另一个的类型并且是prvalue。— 第二个和第三个操作数都有 void 类型;结果是 void 类型并且是纯右值。[ 注意:这包括两个操作数都是 throw 表达式的情况。——尾注]
为什么 Comeau 编译器和 gcc 都允许这段代码?
int main()
{
true ? throw 0 : throw 1;
}