1、decltype意義指針
有時咱們但願從表達式的類型推斷出要定義的變量類型,可是不想用該表達式的值初始化變量(若是要初始化就用auto了)。爲了知足這一需求,C++11新標準引入了decltype類型說明符,它的做用是選擇並返回操做數的數據類型,在此過程當中,編譯器分析表達式並獲得它的類型,卻不實際計算表達式的值。對象
2、decltype用法get
1.基本用法編譯器
int getSize(); int main(void) { int tempA = 2; /*1.dclTempA爲int*/ decltype(tempA) dclTempA; /*2.dclTempB爲int,對於getSize根本沒有定義,可是程序依舊正常,由於decltype只作分析,並不調用getSize,*/ decltype(getSize()) dclTempB; return 0; }
2.與const結合編譯
double tempA = 3.0; const double ctempA = 5.0; const double ctempB = 6.0; const double *const cptrTempA = &ctempA; /*1.dclTempA推斷爲const double(保留頂層const,此處與auto不一樣)*/ decltype(ctempA) dclTempA = 4.1; /*2.dclTempA爲const double,不能對其賦值,編譯不過*/ dclTempA = 5; /*3.dclTempB推斷爲const double * const*/ decltype(cptrTempA) dclTempB = &ctempA; /*4.輸出爲4(32位計算機)和5*/ cout<<sizeof(dclTempB)<<" "<<*dclTempB<<endl; /*5.保留頂層const,不能修改指針指向的對象,編譯不過*/ dclTempB = &ctempB; /*6.保留底層const,不能修改指針指向的對象的值,編譯不過*/ *dclTempB = 7.0;
3.與引用結合變量
int tempA = 0, &refTempA = tempA; /*1.dclTempA爲引用,綁定到tempA*/ decltype(refTempA) dclTempA = tempA; /*2.dclTempB爲引用,必須綁定到變量,編譯不過*/ decltype(refTempA) dclTempB = 0; /*3.dclTempC爲引用,必須初始化,編譯不過*/ decltype(refTempA) dclTempC; /*4.雙層括號表示引用,dclTempD爲引用,綁定到tempA*/ decltype((tempA)) dclTempD = tempA; const int ctempA = 1, &crefTempA = ctempA; /*5.dclTempE爲常量引用,能夠綁定到普通變量tempA*/ decltype(crefTempA) dclTempE = tempA; /*6.dclTempF爲常量引用,能夠綁定到常量ctempA*/ decltype(crefTempA) dclTempF = ctempA; /*7.dclTempG爲常量引用,綁定到一個臨時變量*/ decltype(crefTempA) dclTempG = 0; /*8.dclTempH爲常量引用,必須初始化,編譯不過*/ decltype(crefTempA) dclTempH; /*9.雙層括號表示引用,dclTempI爲常量引用,能夠綁定到普通變量tempA*/ decltype((ctempA)) dclTempI = ctempA;
4.與指針結合數據類型
int tempA = 2; int *ptrTempA = &tempA; /*1.常規使用dclTempA爲一個int *的指針*/ decltype(ptrTempA) dclTempA; /*2.須要特別注意,表達式內容爲解引用操做,dclTempB爲一個引用,引用必須初始化,故編譯不過*/ decltype(*ptrTempA) dclTempB;
3、decltype總結引用
decltype和auto均可以用來推斷類型,可是兩者有幾處明顯的差別:1.auto忽略頂層const,decltype保留頂層const;2.對引用操做,auto推斷出原有類型,decltype推斷出引用;3.對解引用操做,auto推斷出原有類型,decltype推斷出引用;4.auto推斷時會實際執行,decltype不會執行,只作分析。總之在使用中過程當中和const、引用和指針結合時須要特別當心。程序