在C++之中,使用auto關鍵字聲明類型能夠將程序員從輸入繁瑣的類型中解放出來,編譯器會自動推導出變量的實際類型。程序員
template<typename It> void dwim(It b, It e) { while(b != e){ typename std::iterator_traits<It>::value_type currValue = *b; ... } }
使用auto關鍵字函數
template<typename It> void dwim(It b, It e) { while(b != e){ auto currValue = *b; ... } }
在C++14中,lambda函數的參數均可以使用auto來定義。code
auto derefLess = // C++14 comparison [](const auto& p1, // function for const auto& p2) // values pointed { return *p1 < *p2; };
使用auto生命類型還能夠將咱們從類型截斷的問題中解放出來:對象
std::vector<int> arrs; auto size = arrs.size();
在C++中,unordered_map
的key的類型是const類型的,因此即使採起以下方式遍歷unordered_map
容器,仍然會產生臨時對象:get
std::unordered_map<std::string, int> m; ... for (const std::pair<std::string, int>& p : m) { ... // do something with p }
可是藉助auto,咱們不只使聲明更加簡潔,還避開了此問題:編譯器
std::unordered_map<std::string, int> m; ... for (const auto& p : m) { ... // do something with p }
在C++中,由於標準不容許返回對bit的引用,因此對於vector<bool>
標準庫進行了特化處理,其[]
運算符返回的是std::vector<bool>::reference
類型的臨時對象。對臨時對象的修改會被其同步到vector中,於是這樣使用auto關鍵字是不合規的。同步
Widget w; … auto highPriority = features(w)[5]; // w是否是個高優先級的? … processWidget(w, highPriority); // 配合優先級處理w
在這種狀況下,咱們只需顯示指出highPriority
的類型爲bool便可規避此問題。string