假设有一个声明:
struct A { static int i; };
A a;
据我所知,输入字符串int decltype(a)::i = 0;
没有严格描述的行为。
可以将其解析为int decltype(a)::i = 0;
,其中:
int
是 decl-specifier ,decltype(a)::i
是declarator
。
但是,它可以解析为int decltype(a) ::i = 0;
,其中
int
和decltype(a)
被解析为decl-specifer
s,::i
是全局变量i
的(重新)声明 - 编译器应该给出错误消息这就像" decl-specifier-seq 不应该包含两个类型说明符 s"。
我清楚地知道解析的第一种方法应该是正确的,但我找不到任何证据。
无论如何,在int A::a = 0;
中,A
肯定会被解析为declarator
的一部分,因为A
是类型名称和在标准中描述
如果在解析decl-specifier-seq时遇到 type-name ,它将被解释为 decl-specifier-seq 的一部分,当且仅当有除了 decl-specifier-seq 中的 cv-qualifier 之外,之前没有 type-specifier 。
在constrant中,decltype(a)
不是类型名称,它是类型说明符。
我不是发现了一场吵架,我有这个问题,因为我正在为C ++编写解析器。
所以,我想知道描述是否应该是:
如果在解析 decl-specifier-seq 时遇到类型说明符,则会将其解释为 decl-specifier-seq的一部分当且仅当 decl-specifier-seq 中除了 cv-qualifier 之外没有先前的类型说明符时。
答案 0 :(得分:3)
[dcl.meaning]/1明确禁止您的定义:
限定的 declarator-id 的嵌套名称说明符不得以 decltype-specifier 开头。
(GCC和VC ++在这方面都有错误。)
您的实现的具体诊断(无论是指多个类型说明符还是无效的嵌套名称说明符)只是一个QoI问题。实际上,实现可能会在类型说明符上实现最大munch原则的一些变化,类似于original wording of your quote resembled(这就是GCC和VC ++接受你的代码的原因)。但是,您预期ICC gives the exact error message:
错误:类型说明符的组合无效
请注意,您的“分辨率”也不正确,因为我们可以有多个类型说明符;见[dcl.type]/2。实际上,措辞很好,因为如果有效声明符的开头(在您的无效情况下,decltype(a)
)是类型说明符,它也是类型名称。