现代C++编程实战:132个核心技巧示例(原书第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.2 工作原理

typedef声明为类型引入了同义词(即别名)。它不引入其他类型(如class、struct、union和enum声明)。使用typedef声明引入的类型名称遵循与标识符名称相同的隐藏规则。它们也可以被重新声明,但是必须指向相同的类型(因此,只要同义词指向的是相同的类型,就可以在同一单元针对同一类型有多次合法的typedef声明)。下面是关于typedef声明的几个示例:

类型别名声明和typedef声明之间没有区别,它可出现于块作用域、类作用域或命名空间作用域。请参考C++11的7.1.3.2节:

typedef名称也可以通过别名声明引入。using关键字后面的标识符变成typedef名称,标识符后面的可选属性说明符序列属于该typedef名称。它的语义与由typedef说明符引入的语义相同。特别是,它没有定义新的类型,也不应出现在type-id中。

但是,相对于实际类型,当数组和函数指针使用别名声明时,更具可读性,也更清晰。在1.2.1节的示例中,很容易理解array_t是10个整数数组的类型的名称,而fn是接受两个类型分别为byte和double的参数、返回值为void的函数类型的名称。这也与声明std::function对象的语法(例如,std::function<void(byte,double)>f)一致。

请务必注意以下事项:

❍ 不能偏特化或显式特化模板别名。

❍ 在推导模板形参时,通过模板实参推导始终无法推导出模板别名。

❍ 特化别名模板时所生成的类型不允许直接或间接使用它自己的类型。

新语法的目的是定义模板别名。模板别名是一种模板,当其特化时等价于将模板别名的模板实参替换为类型标识中的模板形参的结果。