1. 程式人生 > >C++11:自動型別推導與型別獲取

C++11:自動型別推導與型別獲取

auto

話說C語言還處於K&R時代,也有auto a = 1;的寫法。中文譯過來叫自動變數,跟c++11的不同,C語言的auto a = 1;相當與 auto int a = 1;語句。 而C++11的auto是有著嚴格的型別推匯出來的。以前是這麼寫 int a = 1; 現在,編譯器知道a是int型了。所以可以這麼寫 auto a = 1; 對於型別比較長的,如vector::iterator這類的,能少敲些字元了。 如果僅僅就這點作用,那麼對程式設計實在沒什麼太大的益處,雖然自動型別推導對於編譯器而言,是個高大上的話題。實際上,作用遠遠不止這點啊。適當地使用auto,會是你的程式碼更優雅,舉例說明:

template <typename BuiltType, typename Builder> void makeAndProcessObject (const Builder& builder) { BuiltType val = builder.makeObject(); // do stuff with val }

從這程式碼來看,BuiltType的用處不大,但必須這麼寫才能編譯過。有了auto後,你可以這麼寫 template void makeAndProcessObject(const Builder& builder) { auto val = builder.makeObject(); // do stuff with val } 這比上段程式碼就優雅些了。可是如果我要返回val的值呢?我們還是要傳入BuildTye,因為c++11並沒有提供通過返回值來推導返回型別(現在終於明白了,不是系統推導不出來,而是c++11沒有提供罷了,c++14將會有這個特性。)

在看一遍auto a = 1;表示式。發現自動型別推導具有這樣的特點:它可以先不必知道是什麼型別,而是根據後面的資訊來推導。如果我們能把返回型別先用auto代替,然後在給些資訊讓編譯器推匯出來,這就需要派上decltype了。

decltype

decltype意為declared Type,即宣告型別。decltype(x)表示從x中提取型別。因此,可以這樣寫: decltype(x) y = x; 當然,x也可以換成一個表示式,decltype(builder.makeObject())將得到makeObject()返回的型別。如果我們結合auto和decltype就可以寫出如下程式碼: template auto makeAndProcessObject(const Builder& builder) -> decltype(builder.makeObject()) { auto val = builder.makeObject(); // do stuff with val return val; }

這就是返回型別後置。從上面的例子可以看出,decltype對於模板編寫會有所幫助。如果不用自己寫模板的話,或許用的並不多。

decltype這個特性,BS在2002年就提議標準化這類操作符了。gcc c++編譯器於2008加入該特性,visual c++ 2010以擴充套件形式提供了該特性,到c++11才加入標準。