1.类型说明符
typedef
typedef double wages;
typedef wages base; *p;//p是double*的同义词;
using
using SI=Sales_item;//SI是Sales_item的同义词
理解下面的类型别名:
typedef char *Pstring;
const Pstring cstr=0;//cstr是指向char的常量指针
const Pstring *ps;//ps是一个指针,他指向的对象是一个指向char的常量指针
注意下面这种理解是错误的;
const char* cstr=0//指向常量的指针
2.auto类型说明符
编译器推断出来的auto类型有时和初始值得类型并不完全一样,编译器会适当的改变结果类型并使其更符合初始化规则。
(1)引用: int i=0,&r=i;
auto a=r;//a是一个整数类型
(2)auto一般会忽略顶层const(即自身的常量性),同事保留底层const:
const int ci=i,&cr=ci;
auto b=ci;//b的类型是int(顶层const被忽略)
auto c=cr;//c的类型是int(ci本身也是顶层const)
auto d=&i;//d的类型是int*
auto e=&ci;//e的类型是const int*
如果希望推断出auto的顶层const,需要明确指出
const auto f=ci;
还可以将引用的类型设为auto,此时原来的初始化规则仍然适用:
auto &g=ci;//g是一个整型常量引用;
auto &h=42;//错误,把非常量引用绑定的字面值
const auto &j=42:;//正确,可以为常量引用绑定字面值
3.decltype类型指示符
应用情况:有时希望从表达式的类型推断出要定义的变量类型,但不想用该表达式的值初始化变量。
decltype(f())sum=x;//sum的类型就是函数f的返回类型
decltype处理顶层的const和引用的方式与auto有点不同。如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用):
const int ci=0,&cj=ci;
decltype (ci) x=0;//x的类型是 const int
decltype(cj) y=x;//y 的类型是const int&
decltype(cj) z;//错误,z是引用必须初始化
需要指出的是。引用从来都是作为其所指对象的同义词出现,只有用在decltype处是一个例外。
decltype和引用
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型,
但有些表达式将向decltype返回一个引用类型,一般发生这种情况,意味着该表达式的结果能作为一条赋值语句的左值:
int i=42,*p=&i,&r=i;
decltype(r+0) b;//正确,加法的结果是int。所以。。。
decltype(*p) c;//错误:c是int&,必须初始化,如果表达式的类型是解引用类型,则decltype将得到引用类型;
decltype和auto的另一处重要不同是;decltype的结果与表达式的形式密切相关。例如,如果使用的是一个不加()的变量,则得到的结果是该变量类型,如果加上一层或多层,编译器就会把他当做一个表达式。变量时一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型:
decltype((i)) d;//错误:d是int&必须初始化
decltype(i) d;//d是一个未初始化的int