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++ 词法分析器中。
* 实际上并不相同。文本恰好区分了声明符和独立的初始化部分。
不,这是无效的。
catch 子句的语法指定type-specifier-seq declarator。这部分declarator不包括初始化程序。将其与函数参数的语法进行比较,函数参数确实允许初始化器:
attr(optional) decl-specifier-seq declarator = initializer