C++11新標準:decltype關鍵字

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、引用和指針結合時須要特別當心。程序

相關文章
相關標籤/搜索