类型别名+auto类型说明符+decltype类型说明符

来源:互联网 发布:锐捷网络的网址 编辑:程序博客网 时间:2024/05/17 04:46

1.类型说明符

typedef 

typedef double wages;

typedef wages base; *p;//pdouble*的同义词;

using 

using SI=Sales_item//SISales_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是一个整数类型

2auto一般会忽略顶层const(即自身的常量性),同事保留底层const

const int ci=i&cr=ci;

auto b=ci;//b的类型是int(顶层const被忽略)

auto c=cr;//c的类型是intci本身也是顶层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类型指示符

应用情况:有时希望从表达式的类型推断出要定义的变量类型,但不想用该表达式的值初始化变量。

decltypef())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;//错误:cint&,必须初始化,如果表达式的类型是解引用类型,则decltype将得到引用类型;

decltypeauto的另一处重要不同是;decltype的结果与表达式的形式密切相关。例如,如果使用的是一个不加()的变量,则得到的结果是该变量类型,如果加上一层或多层,编译器就会把他当做一个表达式。变量时一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型:

decltype((i)) d//错误:dint&必须初始化

decltypei) d//d是一个未初始化的int

 

 

 

 

 

0 0