當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別:
[cpp]view plain
copy
auto x = 1;
編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了:幫你省去大量冗長的型別宣告語句。
比如下面這個例子:
在原來的c++中,你要想使用vector的迭代器得這麼寫:
[cpp]view plain
copy
vector<
int> vec;
vector>::iterator itr = vec.iterator();
看起來就很不爽。現在你可以這麼寫了:
[cpp]view plain
copy
vector<
int> vec;
auto itr = vec.iterator();
果斷簡潔多了吧。假如說自動型別推斷只有這樣的用法的話那未免也太*****了。在很多情況下它還能提供更深層次的便利。
比如說有這樣的**:
[cpp]view plain
copy
template
<
typename
builttype,
typename
builder>
void
makeandprocessobject (const
builder& builder)
這個函式的功能是要使用builder的makeobject產生的例項來進行某些操作。但是現在引入了泛型程式設計。builder的型別不同,那麼makeobject返回的型別也不同,那麼我們這裡就得引入兩個泛型。看起來很複雜是吧,所以這裡就可以使用自動型別推斷來簡化操作:
[cpp]view plain
copy
template
<
typename
builder>
void
makeandprocessobject (const
builder& builder)
因為在得之builder的型別之後,編譯器就已經能知道makeobject的返回值型別了。所以我們能夠讓編譯器自動去推斷val的型別。這樣一來就省去了乙個泛型。
你以為自動型別推斷只有這樣的用法?那也太*****了。c++11還允許對函式的返回值進行型別推斷
在原來,我們宣告乙個函式都是這樣的:
[cpp]view plain
copy
inttemp(
inta,
double
b);
前面那個int是函式的返回值型別,temp是函式名,int a, double b是引數列表。
現在你可以將函式返回值型別移到到引數列表之後來定義:
[cpp]view plain
copy
auto temp(
inta,
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
intx = 3;
decltype(x) y = x; // same thing as auto y = x;
上述**就使用了型別獲取功能。和函式返回值後置語法結合起來,可以有如下應用:
[cpp]view plain
copy
template
<
typename
builder>
auto
makeandprocessobject (const
builder& builder) -> decltype( builder.makeobject() )
前面的例子中這個函式的返回值是void,所以不需要為返回值引入泛型。如果返回值是makeobject的返回值的話,那麼這個函式就得引入兩個泛型。現在又了型別獲取功能,我們就能在返回值中自動推斷makeobject的型別了。所以decltype確實為我們提供了很大的便利。
這個功能非常重要,在很多時候,尤其是引入了泛型程式設計的時候,你可能記不住乙個變數的型別或者型別太過複雜以至於寫不出來。你就要靈活使用decltype來獲取這個變數的型別。
**:
C 11 自動型別推斷和型別獲取
1.自動型別判斷 編譯器能夠在乙個變數的宣告時候推斷出它的型別,那麼你就能夠用auto 關鍵字來作為他們的型別。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你省去大量冗長的型別宣告語句。如下 vector vec vector iterator itr vec....
C 11新特性之POD型別
pod plain old data 是c 中非常重要的乙個概念,用來描述乙個型別的屬性其中plain表示這個型別是個平凡的型別,old表示其與c的相容性。c 11中將pod劃分為兩個基本概念 平凡的 trival 和標準布局 standardlayout 什麼是平凡性呢?通常乙個平凡的類或者結構體...
c 11 型別推斷
當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別 cpp view plain copy auto x 1 編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你...