c 11 型別推斷

2021-09-06 15:15:35 字數 3072 閱讀 7981

當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別:

[cpp]view plain

copy

auto x = 1;  

編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了:幫你省去大量冗長的型別宣告語句。

比如下面這個例子:

在原來的c++中,你要想使用vector的迭代器得這麼寫:

[cpp]view plain

copy

vector vec;  

vector::iterator itr = vec.iterator();  

看起來就很不爽。現在你可以這麼寫了:

[cpp]view plain

copy

vector vec;  

auto itr = vec.iterator();  

果斷簡潔多了吧。假如說自動型別推斷只有這樣的用法的話那未免也太*****了。在很多情況下它還能提供更深層次的便利。

比如說有這樣的**:

[cpp]view plain

copy

template

void

makeandprocessobject (const builder& builder)    

這個函式的功能是要使用builder的makeobject產生的例項來進行某些操作。但是現在引入了泛型程式設計。builder的型別不同,那麼makeobject返回的型別也不同,那麼我們這裡就得引入兩個泛型。看起來很複雜是吧,所以這裡就可以使用自動型別推斷來簡化操作:

[cpp]view plain

copy

template

void

makeandprocessobject (const builder& builder)    

因為在得之builder的型別之後,編譯器就已經能知道makeobject的返回值型別了。所以我們能夠讓編譯器自動去推斷val的型別。這樣一來就省去了乙個泛型。

你以為自動型別推斷只有這樣的用法?那也太*****了。c++11還允許對函式的返回值進行型別推斷

在原來,我們宣告乙個函式都是這樣的:

[cpp]view plain

copy

int temp(int a, double b);  

前面那個int是函式的返回值型別,temp是函式名,int a, double b是引數列表。

現在你可以將函式返回值型別移到到引數列表之後來定義:

[cpp]view plain

copy

auto temp(int a, double b) -> int;  

後置返回值型別可以有很多用處。比如有下列的類定義:

[cpp]view plain

copy

class person  

;  void setpersontype (persontype person_type);  

persontype getpersontype ();  

private:  

persontype _person_type;  

};  

那麼在定義getpersontype函式的時候我們得這麼寫:

[cpp]view plain

copy

person::persontype person::getpersontype ()    

因為函式所在的類person是宣告在函式返回值之後的,所以在寫返回值的時候編譯器並不知道這個函式是在哪個類裡面。由於persontype是person類的內部宣告的列舉,所以在看到persontype的時候,編譯器是找不到這個型別的。所以你就得在persontype前面加上person::,告訴編譯器這個型別是屬於person的。這看起來有點麻煩是吧。當你使用新的返回值語法的時候呢就可以這麼寫:

[cpp]view plain

copy

auto person::getpersontype () -> persontype    

因為這次編譯器看到返回值型別persontype的時候已經知道這個函式屬於類person。所以它會到person類中去找到這個列舉型別。

當然上述應用只能說是乙個奇技淫巧而已。並沒有幫我們多大的忙(**甚至都沒有變短)。所以還得引入c++11的另乙個功能。

既然編譯器能夠推斷乙個變數的型別,那麼我們在**中就應該能顯示地獲得乙個變數的型別資訊。所以c++介紹了另乙個功能:decltype。(實在是不知道這個詞該怎麼翻譯,姑且稱之為型別獲取)。

[cpp]view plain

copy

int x = 3;  

decltype(x) y = x; // same thing as auto y = x;

上述**就使用了型別獲取功能。和函式返回值後置語法結合起來,可以有如下應用:

[cpp]view plain

copy

template

auto  

makeandprocessobject (const builder& builder) -> decltype( builder.makeobject() )  

前面的例子中這個函式的返回值是void,所以不需要為返回值引入泛型。如果返回值是makeobject的返回值的話,那麼這個函式就得引入兩個泛型。現在又了型別獲取功能,我們就能在返回值中自動推斷makeobject的型別了。所以decltype確實為我們提供了很大的便利。

這個功能非常重要,在很多時候,尤其是引入了泛型程式設計的時候,你可能記不住乙個變數的型別或者型別太過複雜以至於寫不出來。你就要靈活使用decltype來獲取這個變數的型別。

c 11 型別推導

auto與decltype都是在編譯時期進行自動型別的推導 auto name value 1.int x 0 2.auto p1 x p1 為 int auto 推導為 int 3.auto p2 x p2 為 int auto 推導為 int 4.auto r1 x r1 為 int auto ...

C 11 型別推導auto

在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。使用auto會拖慢c 效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。使用auto會拖累c 編譯效率嗎?完全不...

C 11 自動型別推斷和型別獲取

1.自動型別判斷 編譯器能夠在乙個變數的宣告時候推斷出它的型別,那麼你就能夠用auto 關鍵字來作為他們的型別。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你省去大量冗長的型別宣告語句。如下 vector vec vector iterator itr vec....