1. 程式人生 > >關注C++細節——C++11新標準之decltype的使用注意

關注C++細節——C++11新標準之decltype的使用注意

c++11新特性——decltype

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

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

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

intiarr[10] = {0};
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(){
	//本文作者(CSDN   iaccepted)
	return***;
}
上述的語句就是錯誤的,因為很明顯decltype(iarr) 表示以陣列作為返回值,這在c++中是不允許的。
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)返回一個數組型別,該型別為指向一個有三個整形元素的陣列,所以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 凌風)

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

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

*ia= 5;

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

decltype(ia[1])b; //也是錯誤的,因為b為一個引用必須初始化。
//本文作者(CSDN   iaccepted 凌風)

好了,暫時就想到這麼多,先寫到這吧

本人新的部落格地址凌風技術站