轉載自:https://www.cnblogs.com/cauchy007/p/4966485.html
1.decltype意義
有時我們希望從表達式中推斷出要定義變量的類型,但是不想用該表達式的值初始化變量(如果要初始化就用auto了)。為了滿足這一需求,C++11新标準引入了decltype類型說明符,它的作用是選擇并傳回操作數的資料類型,在此過程中,編譯器分析表達式并得到它的類型,卻不實際計算表達式的值。
2.decltype用法
2.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.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;
2.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;
2.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、引用和指針結合時需要特别小心。
參考資料:
https://www.cnblogs.com/cauchy007/p/4966485.html
https://www.cnblogs.com/QG-whz/p/4952980.html