自動類型推斷
當編譯器能夠在一個變量的聲明時候就推斷出它的類型,那麼你就能夠用auto關鍵字來作為他們的類型:
auto x = 1;
編譯器當然知道x是integer類型的。所以你就不用int了。接觸過泛型編程或者API編程的人大概可以猜出自動類型推斷是做什麼用的了:幫你省去大量冗長的類型聲明語句。
比如下面這個例子:
在原來的C++中,你要想使用vector的迭代器得這麼寫:
vector<int> vec;
vector<int>::iterator itr = vec.iterator();
看起來就很不爽。現在你可以這麼寫了:
vector<int> vec;
auto itr = vec.iterator();
果斷簡潔多了吧。假如說自動類型推斷只有這樣的用法的話那未免也太naive了。在很多情況下它還能提供更深層次的便利。
比如說有這樣的代碼:
template <typename BuiltType, typename Builder>
void
makeAndProcessObject (const Builder& builder)
{
BuiltType val = builder.makeObject();
// do stuff with val
}
這個函數的功能是要使用builder的makeObject產生的實例來進行某些操作。但是現在引入了泛型編程。builder的類型不同,那麼makeObject返回的類型也不同,那麼我們這裡就得引入兩個泛型。看起來很復雜是吧,所以這裡就可以使用自動類型推斷來簡化操作:
template <typename Builder>
void
makeAndProcessObject (const Builder& builder)
{
auto val = builder.makeObject();
// do stuff with val
}
因為在得之builder的類型之後,編譯器就已經能知道makeObject的返回值類型了。所以我們能夠讓編譯器自動去推斷val的類型。這樣一來就省去了一個泛型。
你以為自動類型推斷只有這樣的用法?那也太naive了。C++11還允許對函數的返回值進行類型推斷