以下段落摘自[dcl.typedef]:
在其声明范围内,typedef 名称在语法上等同于关键字,并以第8条所述的方式命名与标识符相关联的类型。因此,typedef 名称是另一种类型的同义词。typedef 名称不像类声明(9.1)或枚举声明那样引入新类型。
我们需要的另一个相关段落来自[dcl.type]:
通常情况下,在声明的完整声明说明序列中或在类型说明序列或尾随类型说明序列中最多只允许一个类型说明符。唯一的例外是以下情况:……long 可以与 long 结合使用。
在以下代码中,i1 只是 long 的同义词。
因此,我希望第二行被理解为
在其声明范围内,typedef 名称在语法上等同于关键字,并以第8条所述的方式命名与标识符相关联的类型。因此,typedef 名称是另一种类型的同义词。typedef 名称不像类声明(9.1)或枚举声明那样引入新类型。
我们需要的另一个相关段落来自[dcl.type]:
通常情况下,在声明的完整声明说明序列中或在类型说明序列或尾随类型说明序列中最多只允许一个类型说明符。唯一的例外是以下情况:……long 可以与 long 结合使用。
在以下代码中,i1 只是 long 的同义词。
typedef long i1;
typedef long i1 i2;
因此,我希望第二行被理解为
typedef long long i2
。然而,MSVC2015RC 给出了以下错误信息:
Error 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
decl-specifier-seq允许一系列类型说明符,只要它们满足组合规则。尽管类型由类型说明符指定,但我认为类型与类型说明符并不相同;-)
long long
中,第一个long
不是第二个long
的 限定词 或 形容词。 - Basile Starynkevitchi1
可以替换long
,仅仅因为它们都像关键字一样工作,这有点牵强。 - Applesi1
是long int
类型的同义词,而不是关键字long
的同义词。否则你也可以说i1 double
并得到一个long double
。 - Apples