我遇到了一些如下所示的C ++代码:
class exception {};
int main()
{
try {
throw exception();
} catch (exception()) {
// ...
}
}
请注意catch (exception())
中额外的一组括号。根据{{3}},这被编译为相同的对象代码,就好像它是用catch (exception &)
编写的一样。
在什么基础上允许使用额外的括号,以及标准的哪一部分允许这样做?据我所知,catch
子句需要一个类型说明符,但exception()
似乎不是一个类型说明符。
答案 0 :(得分:13)
异常处理程序声明的工作方式类似于函数声明,因为数组和函数类型参数都调整为指针。 (也就是说,数组和函数不能被“按值”抛出或捕获。)具体来说,[except.handle] p2说:
类型为“
T
数组”或函数类型T
的处理程序被调整为“指向T
”的类型。
因此catch (exception())
与catch (exception(*p)())
相同。
答案 1 :(得分:1)
exception()
宣布一项功能。每except#nt:handler,异常声明包含声明符。 function declaration是一种声明者。这很容易看到,因为exception(int)
也可以正常工作。请注意, exception-declaration 恰好与参数声明完全相同,因此它与在参数中声明函数完全相同。