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

轉載自:

CSDN   iaccepted  凌風,博客地址:http://blog.csdn.net/iaccepted


decltype是C++11添加的一個新的關鍵字,目的是選擇並返回操作數的數據類型,重要的是,在此過程中編譯器分析表達式並得到它的類型,卻不實際計算表達式的值。

對於內置類型的對象,使用decltype很直觀,但當參數爲複合類型的時候就應該注意一些使用細節問題。

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

 

  1. intiarr[10] = {0};  
  2. decltype(iarr)ib;  
intiarr[10] = {0};
decltype(iarr)ib;

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

 

  1. cout<< sizeof(ib) << endl;  
        cout<< sizeof(ib) << endl;

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

         

  1. typedefint iarr[10];  
  2. iarrib; //跟這裏的decltype(iarr) ib是一樣的功能。  
typedefint iarr[10];
iarrib; //跟這裏的decltype(iarr) ib是一樣的功能。

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

  1. decltype(iarr)function(){  
  2.     //本文作者(CSDN   iaccepted)   
  3.     return***;  
  4. }  
decltype(iarr)function(){
	//本文作者(CSDN   iaccepted)
	return***;
}
上述的語句就是錯誤的,因爲很明顯decltype(iarr) 表示以數組作爲返回值,這在c++中是不允許的。

  1. intia[3];  
  2. intiaa[][3] = { { 0 }, { 1 }, { 2 }, { 3 }, { 4 } };  
  3. 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的注意點。

 

         

  1. decltype(ia)*function(int index){  
  2.     if (index == 1)returniaa;  
  3.     elsereturn iab;  
  4. }//本文作者(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參數爲指針的解引用的話就要注意了,此時返回引用類型而不是解引用後的類型。

 

         

  1. intia[3] = { 1, 2, 3 };//本文作者(CSDN   iaccepted 凌風)  
intia[3] = { 1, 2, 3 };//本文作者(CSDN   iaccepted 凌風)

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

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

         

  1. *ia= 5;  
*ia= 5;

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

        

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

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

 

本文作者:CSDN   iaccepted  凌風,博客地址:http://blog.csdn.net/iaccepted



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章