轉載自:
CSDN iaccepted 凌風,博客地址:http://blog.csdn.net/iaccepted
decltype是C++11添加的一個新的關鍵字,目的是選擇並返回操作數的數據類型,重要的是,在此過程中編譯器分析表達式並得到它的類型,卻不實際計算表達式的值。
對於內置類型的對象,使用decltype很直觀,但當參數爲複合類型的時候就應該注意一些使用細節問題。
1.當decltype作用於數組的時候就應該小心了,本文作者(CSDN iaccepted)。
- intiarr[10] = {0};
- decltype(iarr)ib;
intiarr[10] = {0};
decltype(iarr)ib;
這個時候ib的定義等價於 int ib[10];兩者是一樣的,不要認爲ib是一個指針了,它是一個正宗的數組。我們可以驗證一下:
- cout<< sizeof(ib) << endl;
cout<< sizeof(ib) << endl;
如果ib是10個元素數組的指針很明顯將輸出4,但是如果ib表示數組類型則會輸出4*10 = 40.這地方完全類似於原有的typedef關鍵字。
- typedefint iarr[10];
- iarrib; //跟這裏的decltype(iarr) ib是一樣的功能。
typedefint iarr[10];
iarrib; //跟這裏的decltype(iarr) ib是一樣的功能。
2.就是因爲上述的這個細節,在寫函數返回值的時候就要注意類型問題。
- decltype(iarr)function(){
- //本文作者(CSDN iaccepted)
- return***;
- }
decltype(iarr)function(){
//本文作者(CSDN iaccepted)
return***;
}
上述的語句就是錯誤的,因爲很明顯decltype(iarr) 表示以數組作爲返回值,這在c++中是不允許的。
- intia[3];
- intiaa[][3] = { { 0 }, { 1 }, { 2 }, { 3 }, { 4 } };
- intiab[][3] = { { 1 }, { 2 }, { 3 }, { 4 }, { 5 } };
intia[3];
intiaa[][3] = { { 0 }, { 1 }, { 2 }, { 3 }, { 4 } };
intiab[][3] = { { 1 }, { 2 }, { 3 }, { 4 }, { 5 } };
這時候我們寫個函數通過參數決定是使用iaa數組還是iab數組,也就是返回值要返回哪個數組首地址,要返回二維數組的首地址當然有多種寫法,這裏主要說一下使用decltype的注意點。
- decltype(ia)*function(int index){
- if (index == 1)returniaa;
- elsereturn iab;
- }//本文作者(CSDN iaccepted 凌風)
decltype(ia)*function(int index){
if (index == 1)returniaa;
elsereturn iab;
}//本文作者(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] = { 1, 2, 3 };//本文作者(CSDN iaccepted 凌風)
intia[3] = { 1, 2, 3 };//本文作者(CSDN iaccepted 凌風)
decltype(*ia)b; //這就會出錯,因爲此時b是一個指向整形變量的引用,而引用必須在定義的時候初始化。
這裏爲什麼返回引用其實很好理解,因爲*ia就是當前指針所指對象的一個引用,因爲我們可以直接給*ia賦值來改變ia所指對象的值,比如
- *ia= 5;
*ia= 5;
此時ia[0] 就變成5. 同理
- decltype(ia[1])b; //也是錯誤的,因爲b爲一個引用必須初始化。
- //本文作者(CSDN iaccepted 凌風)
decltype(ia[1])b; //也是錯誤的,因爲b爲一個引用必須初始化。
//本文作者(CSDN iaccepted 凌風)
好了,暫時就想到這麼多,先寫到這吧
本文作者:CSDN iaccepted 凌風,博客地址:http://blog.csdn.net/iaccepted