C++11中新增了两种推倒型别的方法,auto和decltype,从而我们的变量定义就方便了很多。
一、auto关键词是根据其初始化物的类型来推导的。
(1)推倒时忽略初始化物本身的const属性。如:
int x=0; auto a=x,b=0; cout<<typeid(a).name()<<"\t"<<typeid(b).name()<<endl;
输出:
i i(i代表int类型)
(2)若为指针或引用,保留其应指涉物的const属性。如:
const int *p=0; int *q = 0; auto px = p; auto qx = q; cout<<typeid(px).name()<<"\t"<<typeid(qx).name()<<endl
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<<typeid(ax).name()<<"\t"<<typeid(xp).name()<<typeid(xxp).name()<<endl;输出:
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<<typeid(iar).name()<<"\t"<<typeid(aiar).name()<<endl; cout<<typeid(f).name()<<"\t"<<typeid(af).name()<<endl;
输出:
A100_i Pi (指向长度为100的int数组 指向int类型的指针)
FiiE PFiiE (参数为int,返回值为int的函数 指向参数为int,返回值为int的函数的指针
(5)引用类型推倒得的是其所绑定类型的对象。如:
int x=0; int &m = x; auto am = m;
++m;
cout<<x<<"\t"<<m<<"\t"<<am<<endl; ++am; cout<<x<<"\t"<<m<<"\t"<<am<<endl;
输出:
1 10
1 11
(6)使用auto定义时,可以像普通定义一样,为其加上const修饰符
int x=0; const int &m = x,*px = &x; ///m和px为指涉向const int的引用和指针 cout<<x<<"\t"<<m<<"\t"<<*px<<endl; ///output:0 0 0 ++x; cout<<x<<"\t"<<m<<"\t"<<*px<<endl; ///output:1 1 1 ++m; ///错误 ++*px; ///错误
二、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<<dx<<"\t"<<dy<<endl; ///output:101 201 ++dz; 错误,dz被推倒为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;
如:
int x; decltype(x) *px=&x,&rx=x,m=x;
int f(int i) { }
decltype(f) df; int arr[100]; decltype(arr) dar; cout<<typeid(df).name()<<"\t"<<typeid(arr).name()<<endl; ///output:FiiE A100_i(6)当为decltype提供的用来推倒类型的表达式为左值时,推倒得到表达式的引用类型,为右值时得到表达式的类型。如:
int x=0; int *p = &x; ///得到int 引用类型 ///decltype(*p) pt; 错误,引用类型必须初始化 decltype(*p) pr = x; ++pr; cout<<x<<"\t"<<pr<<endl; ///output:1 1 ///由于*p+0是右值,因此可以通过下面的方法得到*p类型的对象 decltype(*p + 0) rr; ///ok
原文地址:http://blog.csdn.net/yuanliang01xiaolang/article/details/41210401