C++11中新增了两种推倒型别的方法,auto和decltype,从而我们的变量定义就方便了很多。
一、auto关键词是根据其初始化物的类型来推导的。
(1)推倒时忽略初始化物本身的const属性。如:
int x=0; auto a=x,b=0; cout<输出:
i i(i代表int类型)
(2)若为指针或引用,保留其应指涉物的const属性。如:const int *p=0; int *q = 0; auto px = p; auto qx = q; cout< const int &rx = x; auto &mr = rx; ? ///mr为引涉到const int类型的引用 ++mr; ///错误输出:
PKi(指向const int类型的指针)Pi(指向int类型的指针)
(3) 和一般定义语句一样,一个定义语句中可以定义多个变量,类型也可以不同,但必须具备相同的基本类型。如:int x=0; auto ax=x,*xp=&ax,**xxp=&xp; cout<输出: i Pi PPi(指向int指针的指针),三者的基本类型都为int
const int ci=x; auto *px=&x,*pci = &ci; ///错误,有&x推倒得到基本类型为int,而由&ci推倒得到基本类型为const int(4)数组类型被推到为指针类型,函数类型被推倒为指向函数的指针类型。如:int f(int i) { } int iar[100]; auto aiar = iar; auto af = f; cout<输出:
A100_i Pi (指向长度为100的int数组 指向int类型的指针)
FiiE PFiiE (参数为int,返回值为int的函数 指向参数为int,返回值为int的函数的指针
(5)引用类型推倒得的是其所绑定类型的对象。如:
int x=0; int &m = x; auto am = m;++m;cout<输出:
1 10
1 11
(6)使用auto定义时,可以像普通定义一样,为其加上const修饰符
int x=0; const int &m = x,*px = &x; ///m和px为指涉向const int的引用和指针 cout<二、decltype根据所提供的对象进行推倒,但并不使用其作为初始化物。
(1)推倒时初始化物本身的const属性被保留,字面值推倒为变量。如:
int x=0; const int z=0; decltype(x) dx=100; decltype(0) dy = 200; decltype(z) dz = 300; ++dx; ++dy; cout<
(2)指针或引用的引涉类型const属性被保留。如:int x; const int *p = &x; decltype(p) dp = &x; ///推倒得到指向const int类型的指针 const int &rx = x; decltype(rx) drx = x; ///推倒得到绑定到const int类型的引用 ///++(*p); ///++rx;
(3) 和一般定义语句一样,一个定义语句中可以定义多个变量,类型也可以不同,但必须具备相同的基本类型。
如:
int x; decltype(x) *px=&x,&rx=x,m=x;
(4)数组和函数类型保持原有类型,不做指针转化。如:
int f(int i) { }decltype(f) df; int arr[100]; decltype(arr) dar; cout<(6)当为decltype提供的用来推倒类型的表达式为左值时,推倒得到表达式的引用类型,为右值时得到表达式的类型。如:
int x=0; int *p = &x; ///得到int 引用类型 ///decltype(*p) pt; 错误,引用类型必须初始化 decltype(*p) pr = x; ++pr; cout<