C 11中的decltype用法注意

2021-07-10 18:24:38 字數 1666 閱讀 7036

感謝這位博主的分享

c++11新特性——decltype

decltype是c++11新增的乙個新的關鍵字,目的是選擇並返回運算元的資料型別,重要的是,在此過程中編譯器分析表示式並得到它的型別,卻不實際計算表示式的值。

對於內建型別的物件,使用decltype很直觀,但當引數為復合型別的時候就應該注意一些使用細節問題。

1.當decltype作用於陣列的時候就應該小心了,本文作者(csdn   iaccepted)。

intiarr[10] = ;

decltype(iarr)ib;

這個時候ib的定義等價於 int ib[10];兩者是一樣的,不要認為ib是乙個指標了,它是乙個正宗的陣列。我們可以驗證一下:

cout<< sizeof(ib) << endl;

如果ib是10個元素陣列的指標很明顯將輸出4,但是如果ib表示陣列型別則會輸出4*10 = 40.這地方完全類似於原有的typedef關鍵字。

typedefint iarr[10];

iarrib; //跟這裡的decltype(iarr) ib是一樣的功能。

2.就是因為上述的這個細節,在寫函式返回值的時候就要注意型別問題。

decltype(iarr)function()
上述的語句就是錯誤的,因為很明顯decltype(iarr) 表示以陣列作為返回值,這在c++中是不允許的。

intia[3];

intiaa[3] = , , , , };

intiab[3] = , , , , };

這時候我們寫個函式通過引數決定是使用iaa陣列還是iab陣列,也就是返回值要返回哪個陣列首位址,要返回二維陣列的首位址當然有多種寫法,這裡主要說一下使用decltype的注意點。

decltype(ia)*function(int index)//本文作者(csdn   iaccepted 凌風)

這樣就能實現,decltype(ia)返回乙個陣列型別,該型別為指向乙個有三個整形元素的陣列,所以decltype(ia) * 就能表示乙個指向陣列元素的指標,即該指標指向乙個陣列,陣列內的每個元素又是包含三個整數的陣列元素。以上面的例子來說,函式的返回值若記為p,則p指向iaa[0]而p+1則指向iaa[1],*p 為iaa[0][0]的位址 *p + 1 為iaa[0][1]的位址,這裡就說多了,因為這就是普通指標的特性,ok。

3.當decltype引數為指標的解引用的話就要注意了,此時返回引用型別而不是解引用後的型別。

intia[3] = ;//本文作者(csdn   iaccepted 凌風)

decltype(*ia)b; //這就會出錯,因為此時b是乙個指向整形變數的引用,而引用必須在定義的時候初始化。

這裡為什麼返回引用其實很好理解,因為*ia就是當前指標所指物件的乙個引用,因為我們可以直接給*ia賦值來改變ia所指物件的值,比如

*ia= 5;

此時ia[0] 就變成5. 同理

decltype(ia[1])b; //也是錯誤的,因為b為乙個引用必須初始化。

C 11的decltype關鍵字

decltype關鍵字和auto有異曲同工之處 有時我們希望從表示式的型別推斷出要定義的變數型別,但是不想用該表示式的值初始化變數 如果要初始化就用auto了 為了滿足這一需求,c 11新標準引入了decltype型別說明符,它的作用是選擇並返回運算元的資料型別,在此過程中,編譯器分析表示式並得到它...

C 11特性 decltype關鍵字

我們之前使用的typeid運算子來查詢乙個變數的型別,這種型別查詢在執行時進行。rtti機制為每乙個型別產生乙個type info型別的資料,而typeid查詢返回的變數相應type info資料,通過name成員函式返回型別的名稱。同時在c 11中typeid還提供了hash code這個成員函式...

C 11基礎 decltype關鍵字

1.decltype關鍵字獲取表示式的型別 int x 0 decltype x y 1 y int2.推導規則decltype exp int n 0 volatile const int x n decltype n a n a int decltype x b n b const volati...