typedef中同义词的含义

Hec*_*tor 3 c++ standards c++11

以下段落摘自 [dcl.typedef]:

在其声明的范围内,typedef-name 在语法上等效于关键字,并以第 8 条中描述的方式命名与标识符关联的类型。因此 typedef-name 是另一种类型的同义词。typedef-name 不会像类声明 (9.1) 或枚举声明那样引入新类型。

我们需要的另一个相关段落来自 [dcl.type]

作为一般规则,在声明的完整声明说明符序列中或在类型说明符序列或尾随类型说明符序列中最多允许一个类型说明符。此规则的唯一例外如下:…… long 可以与 long 组合。

在下面的代码中,i1long 只是同义词。

typedef long i1;
typedef long i1 i2;
Run Code Online (Sandbox Code Playgroud)

因此,我希望将第二行理解为typedef long long i2. 但是,MSVC2015RC 失败了

错误 C2146 语法错误:缺少“;” 在标识符“i2”之前

任何人都可以指出标准中使我的期望无效的部分吗?


更新

我的观点是,据我了解 [dcl.type] 中的语法,

type-specifier:
    trailing-type-specifier
    class-specifier
    enum-specifier
trailing-type-specifier:
    simple-type-specifier
    elaborated-type-specifier
    typename-specifier
    cv-qualifier
type-specifier-seq:
    type-specifier attribute-specifier-seq opt
    type-specifier type-specifier-seq
trailing-type-specifier-seq:
    trailing-type-specifier attribute-specifier-seq opt
    trailing-type-specifier trailing-type-specifier-seq
Run Code Online (Sandbox Code Playgroud)

声明说明符序列确实允许一系列类型说明符,只要它们满足组合规则。在我看来,即使类型是由类型说明符指定的,类型也与类型说明符不同;-)

App*_*les 5

好的,我来回答。

首先,看这个:

typedef-name 在语法上等同于关键字

这仅意味着 typedef-names 遵循关键字的语法。这并不意味着 typedef-name 等同于任何特定的关键字。它就像一个新的、独特的关键字。

然后我们有,

typedef-name 因此是另一种类型的同义词。

那么,给定typedef long i1;,这个“另一种类型”是什么?是的long int,不仅仅是long

另外,什么是“类型”?至少,类型说明符不是类型。类型说明符long表示“long int”类型(参见 n3337 的表 10 或 n4296 的表 9)。

我将在这里复制我的评论:

i1对于一个同义词类型long int。它不是关键字 的同义词long。否则你也可以说i1 double并得到一个long double.

虽然也许我应该说,i1不是type-specifier long的同义词,但它是type 的同义词long int