码迷,mamicode.com
首页 > 编程语言 > 详细

C++之auto与decltype

时间:2014-11-17 19:32:46      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:c++   c++11   

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类型

(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<<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

C++之auto与decltype

标签:c++   c++11   

原文地址:http://blog.csdn.net/yuanliang01xiaolang/article/details/41210401

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!