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 declarator
。 declarator
部分不包含初始值设定项。将此与函数参数的语法进行比较, 允许初始化程序:
attr(optional) decl-specifier-seq declarator = initializer
您认为初始化声明符是 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 declarator
。 declarator
部分不包含初始值设定项。将此与函数参数的语法进行比较, 允许初始化程序:
attr(optional) decl-specifier-seq declarator = initializer