gpt4 book ai didi

c++ - C++的语法歧义

转载 作者:IT老高 更新时间:2023-10-28 23:02:27 26 4
gpt4 key购买 nike

假设有一个声明:

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

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

可以解析为int decltype(a)::i = 0;,其中:int 是一个 decl-specifierdecltype(a)::i declarator

但是可以解析为int decltype(a)::i = 0;,其中intdecltype(a) 被解析为 decl-specifers,而 ::i 是 (re ) 声明全局变量 i - 编译器应该给出一个错误消息,类似于“一个 decl-specifier-seq 不应包含两个 type-specifiers"。

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

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

If a type-name is encountered while parsing a decl-specifier-seq, it is interpreted as part of the decl-specifier-seq if and only if there is no previous type-specifier other than a cv-qualifier in the decl-specifier-seq.

同样,decltype(a) 不是 type-name,而是 type-specifier

我不是“找茬”,我有这个问题是因为我正在为 C++ 编写解析器。

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

If a type-specifier is encountered while parsing a decl-specifier-seq, it is interpreted as part of the decl-specifier-seq if and only if there is no previous type-specifier other than a cv-qualifier in the decl-specifier-seq.

最佳答案

[dcl.meaning]/1 明确不允许您的定义:

The nested-name-specifier of a qualified declarator-id shall not begin with a decltype-specifier.

(GCC 和 VC++ 在这方面存在缺陷。)

您的实现的具体诊断(无论是指多个 type-specifier 还是无效的 nested-name-specifier)只是一个 QoI 问题。实际上,实现可能会在 type-specifier 上实现最大 munch 原则的一些变体,类似于 original wording of your quote resembled (这就是 GCC 和 VC++ 接受您的代码的原因)。但是,ICC gives the exact error message你期望的:

error: invalid combination of type specifiers

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

关于c++ - C++的语法歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36113229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com