C++的语法歧义

Syntax ambiguities of C++

本文关键字:歧义 语法 C++      更新时间:2023-10-16

假设有一个声明:

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

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

它可以解析为int decltype(a)::i = 0;,其中: int是一个描述符decltype(a)::i declarator

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

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

无论如何,在int A::a = 0;中,A肯定会被解析为declarator的一部分,因为A是一个类型名,并且如标准中所述

如果在解析 decl-specifier-seq 时遇到类型名称,则当且仅当 decl-specifier-seq 中除了 cv 限定符之外没有以前的类型说明符时,才会将其解释为 decl-specifier-seq 的一部分。

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

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

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

如果在解析 decl-specifier-seq 时遇到类型说明符,则当且仅当 decl-specifier-seq 中除了 cv 限定符之外没有以前的类型说明符时,才会将其解释为 decl-specifier-seq 的一部分。

[dcl.meaning]/1 明确禁止您的定义:

限定声明符 ID嵌套名称说明符不得以 decltype-说明符开头。

(GCC和VC++在这方面是有缺陷的。

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

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

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