对 c++1z 中的 [dcl.spec]/3 的疑问

Doubts about [dcl.spec]/3 in c++1z

本文关键字:spec c++1z 中的 dcl      更新时间:2023-10-16

[dcl.spec]/3 in c++1z (重点是我的(:

如果在解析 decl-specifier-seq 时遇到类型名称, 它被解释为 decl-specifier-seq 的一部分,当且仅当 除了cv-qualifier in the decl-specifier-seq.顺序应自洽,如下所述。[ 示例:

typedef char* Pc;
static Pc;                      // error: name missing

在这里,声明static Pc格式不正确,因为没有名称 为类型 Pc 的静态变量指定。获取变量 称为Pc类型说明符(constvolatile除外(具有 以指示类型定义名称Pc是名称 被(重新(宣布,而不是成为decl-specifier的一部分 序

尽管如此,下面的代码片段并不能用 g++ 和 clang 编译。为什么?

typedef char* Pc;
static int Pc;

该段落的目的是表明typedef char* Pc是有效的,而static Pc不是,而不是你可以将Pc重新声明为其他东西(在同一范围内(。换句话说,static Pcstatic int Pc不是不同的实体。没有任何变化可以让你这样做。

[basic.scope.declarative]/4

给定单个声明区域中的一组声明,每个声明 指定相同的非限定名称,

(4.1( — 它们均应指同一实体,...