【发布时间】:2010-11-15 19:49:56
【问题描述】:
我在一次短暂的 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。
【问题讨论】:
-
+1 很棒的问题。以及一种巧妙的测试方式。
-
该链接似乎相当清楚地表明,类型由编译器确定为所需的任何类型。
-
我认为链接的文章在我查看后已经更新,我确信事实确实如此。但是,我在标准中找不到它。
-
也许不是 - double d = throw "foo";是 g+= 的错误(没有用 comeau 测试过)
-
+1 我很想知道答案。