標籤:c++ c++11
有些情況下,我們希望從運算式的類型推斷出要定義的變數的類型,但是不想用該運算式的值初始設定變數。此時就要用到C++11引入的第二種類型說明符delctype,它的作用就是選擇並返回運算元的資料類型。編譯器分析運算式並得到它的類型,但不實際計算運算式的值:
decltype (size(5)) s = i;‘ decltype返回size函數傳回值的類型,來聲明變數s。
decltype處理頂層const和引用的方式和auto有所不同,如果decltype使用的運算式是一個變數,則decltype返回該變數的類型,包括頂層const和引用。
const int ci = 0, &cj = ci; decltype(ci) x = 0; // x的類型是const int decltype(cj) y = x; // y的類型是const int&, y綁定到x decltype(cj) z; // error, z是一個引用,必須初始化
如果decltype使用的運算式不是一個變數,則decltype返回運算式結果對應的類型。有些運算式向decltype返回一個參考型別,這就意味著該運算式的結果對象能作為一條指派陳述式的左值。
int i = 42, *p = &i, &r = i; decltype(r + 0) b; // 加法的結果是int, b的類型就是int decltype(*p) c; // error, c為int &
因為r是一個引用,decltype(r)的結果是參考型別,要想得到int類型就將r作為運算式的一部分,比如r+0。
如果運算式的內容是解引用操作,則decltype將得到參考型別。
對decltype所用的運算式來說,如果變數加上一對括弧,則得到的類型與不加括弧時會有不同。加上括弧編譯器就把它當成一個運算式,而不加括弧則直接返回變數的類型。
decltype((i)) d; // error, decltype的運算式如果是加上了括弧的變數,結果為引用 decltype(i) e; // e是一個未初始化的int
賦值會產生引用,引用的類型就是左值的類型,如果i是int,i = x的類型就是int&:
int a = 3, b = 4; decltype(a) c = a; decltype(a = b) d = a;
[C++] decltype類型指示符