C++之auto与decltype

2015-01-27 06:20:43 · 作者: · 浏览: 7

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<