【发布时间】:2022-01-17 00:38:15
【问题描述】:
你认为在 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++ 词法分析器具有合法性。
* 实际上并不相同。文本恰好区分了声明器和初始化器部分是分开的。
【问题讨论】:
-
VC 2022 不会编译您的代码。您选择什么标准并不重要(20 年 14 月 17 日)。默认值的意义何在?
-
@LanguageLawyer 我相信这是对
declarator和abstract-declarator描述的转述:“形式参数声明的一部分,与函数参数列表中的相同”。我认为 Tumbleweed 的回答澄清了这里具体称为“相同”的内容。 -
很抱歉给您带来了困惑。我编辑了问题以消除误传。你们完全正确。没有提到整个类型是相同的,但声明部分恰好不包括定义的可选初始化程序。我预计不是这样。感谢您帮助我正确理解参考。
-
@zdf:你实际上是对的......多么奇怪的情况。我很抱歉我错了......这让我很困惑,上面写着“msvc v19.latest”:godbolt.org/z/xKK4E9zM4
-
@zdf:我已经在他们的官方问题跟踪器上发布了我的问题:developercommunity.visualstudio.com/t/…
标签: c++ syntax language-lawyer lexer