我在对 reddit 的一次简短尝试中选择了这个:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
基本上,作者在 C++ 中指出:
throw "error"
是一个表达式。这实际上在 C++ 标准中相当清楚地说明,无论是在正文中还是在语法中。但是,不清楚(至少对我而言)是什么类型的表达式?我猜到了“ void
”,但对 g++ 4.4.0 和 Comeau 进行了一些试验,得出了以下代码:
void f() {
}
struct S {};
int main() {
int x = 1;
const char * p1 = x == 1 ? "foo" : throw S(); // 1
const char * p2 = x == 1 ? "foo" : f(); // 2
}
编译器对 //1 没有任何问题,但在 //2 上却大吃一惊,因为条件运算符中的类型不同。所以throw
表达式的类型似乎不是无效的。
那是什么?
如果您回答,请使用标准中的引用来支持您的陈述。
事实证明,这并不是关于 throw 表达式的类型,而是条件运算符如何处理 throw 表达式——这在今天之前我当然不知道。感谢所有回复的人,尤其是 David Thornley。