標籤:作者 pre nbsp 計算 style art code 特性 二維數組
c++11新特性——decltype
decltype是C++11加入的一個新的keyword,目的是選擇並返回運算元的資料類型,重要的是,在此過程中編譯器分析運算式並得到它的類型,卻不實際計算運算式的值。
對於內建類型的對象。使用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.這地方全然類似於原有的typedefkeyword。
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 淩風)
好了。臨時就想到這麼多,先寫到這吧
本人新的部落格地址 淩風技術站
關注C++細節——C++11新標準之decltype的使用注意