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

Initialized declarator inside of C++ catch statement

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

void func( int = 1 )
{
    try
    {

    }
    catch( int a = 1 )
    {
    }
}

它在最新的 MSVC 17.0.2 下编译正常,但在最新的 GCC 11.2 下编译失败(使用 Godbolt.org 测试)。我想知道答案,以形成对 C++ 代码正确键入的纯粹词汇理解。

如果你阅读 this cppreference.com article 然后你会发现它说函数签名参数的声明应该与 (*) 完全相同,从而使 MSVC C++ 词法分析器具有合法性。

* 其实不一样。文本恰好区分了声明符和单独的初始化程序部分。

首先: 不,这篇文章没有说它允许在 catch 语句中使用初始化程序。

说是参考

的函数说明
  • type-specifier-seq
  • declarator
  • abstract-declarator

initializer 是不同的元素。

第二个:

catch 语句中的初始值设定项毫无意义,因为实际进入 catch 语句需要一个值。这意味着永远不会使用初始化程序值,并且会危及程序流程,因为初始化可能会引发最多会终止的异常。

MSVC 可能是无意义的容忍它,因为它不会影响程序

没有。无效。

catch 子句的语法指定 type-specifier-seq declaratordeclarator 部分不包含初始值设定项。将此与函数参数的语法进行比较, 允许初始化程序:

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