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

Gre*_*ill 12 c++ exception-handling try-catch

我遇到了一些类似于以下内容的C++代码:

class exception {};

int main()
{
    try {
        throw exception();
    } catch (exception()) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

注意括号中的额外括号catch (exception()).根据Compiler Explorer,它被编译为与写入时相同的对象代码catch (exception &).

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

Ker*_* SB 13

异常处理程序声明的工作方式类似于函数声明,因为数组和函数类型参数都调整为指针.(也就是说,数组和函数不能被"按值"抛出或捕获.)具体来说,[except.handle] p2说:

"数组T"或函数类型的处理程序T被调整为"指向T" 的类型.

所以catch (exception())是完全相同的catch (exception(*p)()).