C++的语法歧义
Syntax ambiguities of C++
假设有一个声明:
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;
,其中 int
和 decltype(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)
)是类型说明符,它也是一个类型名称。
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 构造对象的歧义
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 歧义语法是如何解决的
- 用前瞻性解决歧义增强::精神::气语法
- 了解'most vexing parse' - 为什么允许歧义语法?
- C++的语法歧义
- 简单代码中的c++语法歧义
- C++语法歧义