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<