C 11decltype型別指示符

2021-08-02 00:25:03 字數 1318 閱讀 7088

c++11引入型別說明符decltype,作用是選擇並返回運算元的資料型別,在此過程中,編譯器分析表示式並得到它的型別,卻不計算表示式的值:

decltype(f()) sum = x;         //sum的型別就是函式f返回的型別
編譯器並不實際呼叫函式f,而是返回f呼叫發生時的返回型別作為sum的型別。

decltype處理const和引用的方式與auto有些不同。如果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; //錯誤,z是乙個引用,應當初始化

引用從來都是作為其所指物件的同義詞出現,只有在decltype處是乙個例外。

如果decltype的表示式不是乙個變數,則decltype返回表示式結果對應的型別。

int i = 42, *p = &i, &r = i;

decltype(r + 0) b; //正確,加法的結果是int,因此b是乙個未初始化的int

decltype(*p) c; //錯誤,c是int&,必須初始化

r是乙個引用,因此decltype(r)的結果仍然是乙個引用型別,如果想讓結果是r所指的型別,則 可以把r作為表示式的一部分,如r+0,這個表示式的結果是乙個具體的值而非引用。

如果乙個表示式是解引用操作,則decltype將得到引用型別。解引用指標可以得到指標所指的物件,而且還能給這個物件賦值,因此decltype(*p)的型別就是int &而非int。

decltype的結果型別與表示式形式密切相關。如果decltype使用的是乙個不加括號的變數,則得到的結果型別就是該變數的型別。而如果加上了一層或者多層括號,編譯器會將其當成乙個表示式。變數是一種可以作為賦值語句左值的特殊表示式,所以decltype就會得到引用型別:

int i = 42;

decltype((i)) d; //錯誤,d是引用,必須初始化

decltype(i) e; //正確,e是乙個為初始化的int

decltype((variable))的結果永遠都是引用。

Decltype型別指示符

有時候遇到這種情況 希望從表示式的型別推斷出要定義的變數的型別,但是不想用該表示式的值初始化變數。為了滿足這一要求,c 11新標準引入了第二種型別說明符decltype,它的作用是選擇並返回運算元的資料型別。在此過程中,編譯器分析表示式並得到它的型別,卻不實際計算表示式的值 decltype f s...

C11 decltype的用法超簡單範例

decltype主要作用是通過物件編譯期推算獲得型別,輸入引數是物件 例項 變數名,返回乙個型別。常用用法場景 通過auto 推算的宣告的變數很多時候有很長一大串,咱們不太好寫出變數型別,可是又需要用剛才的auto型別宣告其他變數 auto a decltype a b 以lambda表示式的語法通...

C 之decltype型別指示符

decltype 的功能 得到表示式的返回值型別,用於對新變數的宣告或定義。有如下幾點需要注意 1 作用於常量型別得到的還是常量型別。2 作用於引用型別得到的還是引用型別,此時需要對變數初始化。3 當引用作為表示式的一部分,作用於該表示式得到的將不是引用型別。4 decltype variable ...