C++的语法歧义

Chu*_*ess 13 c++ grammar parsing language-lawyer

假设有一个声明:

struct A { static int i; };
A a;
Run Code Online (Sandbox Code Playgroud)

据我所知,输入字符串int decltype(a)::i = 0;没有严格描述的行为.

它可以被解析为int decltype(a)::i = 0;,其中: intDECL说明符decltype(a)::ideclarator.

但是,它可以被解析为int decltype(a) ::i = 0;,在哪里 intdecltype(a)被解析为decl-specifers,并且::i是全局变量的(重新)声明i- 编译器应该给出一个错误消息,其类似于"一个decl-specifier-seq不应该包含两个类型 -说明符 ".

我清楚地知道解析的第一种方法应该是正确的,但我找不到任何证据.

无论如何,in int A::a = 0;,A肯定会被解析为declarator因为A类型名称并且如标准中所述

如果一个类型名称在解析DECL说明符-SEQ遇到,它被解释为部分DECL说明符-SEQ当且仅当没有以前的类型说明符之外的其他CV-预选赛DECL说明符--seq.

在constrant中,decltype(a)不是类型名称,它是类型说明符.

我不是'在稻草中发现争吵',我有这个问题,因为我正在为C++编写解析器.

所以,我想知道描述是否应该是:

如果一个类型说明符遇到在解析DECL说明符-SEQ,它被解释为部分DECL说明符-SEQ当且仅当没有以前的类型说明符之外的其他CV-预选赛DECL说明符--seq.

Col*_*mbo 3

[dcl.meaning]/1明确不允许您的定义:

合格的declarator-id的嵌套名称说明符不应以decltype-specifier开头。

(GCC 和 VC++ 在这方面存在缺陷。)

您的实现的具体诊断(无论是引用多个类型说明符还是无效的嵌套名称说明符)只是一个 QoI 问题。实际上,实现可能会在类型说明符上实现最大蒙奇原则的一些变体,类似于您引用的原始措辞(这就是 GCC 和 VC++ 接受您的代码的原因)。然而,ICC 给出了您期望的确切错误消息

错误:类型说明符的组合无效

请注意,您的“分辨率”也是不正确的,因为我们可以有多个类型说明符;请参阅[dcl.type]/2。事实上,这样的措辞就很好,因为如果有效声明符的开头(在无效的情况下为decltype(a))是type-specifier,那么它也是type-name