C++ catch 语句内的初始化声明符

rpl*_*lgn 3 c++ syntax lexer language-lawyer

您认为初始化的声明符是 catch 语句的捕获声明部分内的有效词法结构吗?例如,看一下下面的代码:

void func( int = 1 )
{
    try
    {

    }
    catch( int a = 1 )
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

它在最新的 MSVC 17.0.2 下编译良好,但在最新的 GCC 11.2 下无法编译(使用 Godbolt.org 测试)。我想知道答案,以便对 C++ 代码的正确类型形成纯粹的词汇理解。

如果您阅读了这篇 cppreference.com 文章,那么您会发现它说声明应该与函数签名参数的 (*) 完全相同,从而将合法性放入 MSVC C++ 词法分析器中。

* 实际上并不相同。文本恰好区分了声明符和独立的初始化部分。

Iod*_*Pit 6

不,这是无效的。

catch 子句的语法指定type-specifier-seq declarator。这部分declarator不包括初始化程序。将其与函数参数的语法进行比较,函数参数确实允许初始化器:

attr(optional) decl-specifier-seq declarator = initializer