2.5.1 类型别名
类型别名(type alias)是一个名字,它是某种类型的同义词。
使用类型别名有很多好处,他让复杂的名字简单明了易于理解
有两种方法定义类型别名
传统方法使用 typedef
typedef double wages ; //wages 是double的同义词
typedef wages base, *p; //base是double的同义词,p是 double*的同义词
新标准规定新方法, 别名声明(alias declaration) using
using SI = Sales_item; //SI是Sales_item的同义词
指针,常量和类型别名
typedef char *pstring;
const char *cstr; //是对 const pstring cstr 的错误理解
pstring 基本数据类型是指针, char*重写后数据类型就变成了char,*成为了声明符的一部分。
char的常量指针,后者声明了一个指向const char的指针
2.5.2 auto类型说明符
auto让编译器通过初始值来推算变量的类型。auto定义的变量必须有初始值
可以在一条语句中声明多个变量,因为只能有一个数据类型,所有变量初始变量都应该相等
auto sz=0,pi=3.14 ;
//错误:sz和pi的类型不一样
复合类型,常量和auto;
auto一般会忽略掉顶层const,同时底层const会保留下来
设置一个类型为auto的引用时,初始值中的顶层常量属性依然保留,给初始值绑定一个引用,则此时初始值必须是同一种类型
2.5.3 decltype类型指示符
decltype 作用是选择并返回操作数的数据类型。过程中,编译器分析表达式并得到它的类型,却不计算表达式的值。
decltype*(f()) sum = x;//sum的类型就是函数f的返回类型
如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用)--和auto不同
decltype和引用
如果r是一个引用,decltype(r)的结果还是一个引用类型,如果想让结果类型是r所指的类型,可以把r作为表达式的一部分,如(r+0),结果是一个具体值而非引用
int i=42,*p= &i;
decltype(*p)c;//错误:c是int&,必须初始化
表达内容是解引用操作,则decltype将得到引用类型
//decltype的表达式如果式加上了括号的变量,结果将会是引用
decltype((i))d;//错误:d是int&,必须初始化
Warning decltype((variable)) 的结果永远是引用,而decltype(variable)结果只有当 variable是一个引用的时候才是引用