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;,其中:
int是DECL说明符和decltype(a)::i的declarator.
但是,它可以被解析为int decltype(a) ::i = 0;,在哪里
int和decltype(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.
[dcl.meaning]/1明确不允许您的定义:
合格的declarator-id的嵌套名称说明符不应以decltype-specifier开头。
(GCC 和 VC++ 在这方面存在缺陷。)
您的实现的具体诊断(无论是引用多个类型说明符还是无效的嵌套名称说明符)只是一个 QoI 问题。实际上,实现可能会在类型说明符上实现最大蒙奇原则的一些变体,类似于您引用的原始措辞(这就是 GCC 和 VC++ 接受您的代码的原因)。然而,ICC 给出了您期望的确切错误消息:
错误:类型说明符的组合无效
请注意,您的“分辨率”也是不正确的,因为我们可以有多个类型说明符;请参阅[dcl.type]/2。事实上,这样的措辞就很好,因为如果有效声明符的开头(在无效的情况下为decltype(a))是type-specifier,那么它也是type-name。
| 归档时间: |
|
| 查看次数: |
672 次 |
| 最近记录: |