C ++的语法歧义

时间:2016-03-20 11:40:06

标签: c++ parsing language-lawyer grammar

假设有一个声明:

struct A { static int i; };
A a;

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

可以将其解析为int decltype(a)::i = 0;,其中: int decl-specifier decltype(a)::ideclarator

但是,它可以解析为int decltype(a) ::i = 0;,其中 intdecltype(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 之外没有先前的类型说明符时。

1 个答案:

答案 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))是类型说明符,它也是类型名称