为什么catch异常声明允许尾随括号?

时间:2018-02-19 01:49:52

标签: c++ exception-handling try-catch

我遇到了一些如下所示的C ++代码:

class exception {};

int main()
{
    try {
        throw exception();
    } catch (exception()) {
        // ...
    }
}

请注意catch (exception())中额外的一组括号。根据{{​​3}},这被编译为相同的对象代码,就好像它是用catch (exception &)编写的一样。

在什么基础上允许使用额外的括号,以及标准的哪一部分允许这样做?据我所知,catch子句需要一个类型说明符,但exception()似乎不是一个类型说明符。

2 个答案:

答案 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 恰好与参数声明完全相同,因此它与在参数中声明函数完全相同。