類型推導
- 在傳統
C/C++
中,任何參數的類型都必須明確定義,這會使開發效率變慢,而且讓代碼變得冗長 C++11
引入了auto
和decltype
實現了類型推導
一、auto
-
使用
auto
進行類型推導的一個最爲常見而且顯著的例子就是迭代器,以前需要這樣寫:for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)
有了
auto
之後可以:for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr)
-
auto
常見用法auto i = 5; //auto被推導爲int auto arr = new auto(10); //auto被推導爲int *
-
auto
不可以用於函數傳參,如下用法在C++11中是錯誤的int add(auto x, auto y) { return x+y; } int main() { cout<<add(5,6); return 0; }
不過在C++14中可以正常編譯通過
int add(auto x, auto y) { return x+y; } int main() { cout<<add(5,6); return 0; }
輸出
11
-
auto
不能用與推導數組類型int main() { int arr[10] = {0}; auto auto_arr = arr; auto auto_arr2[10] = arr; //錯誤 cout<<*auto_arr2; return 0; }
二、decltype
-
auto
關鍵字只能對變量進行類型推導,decltype
用法和sizeof
很相似int main() { auto x = 1; auto y = 2; decltype(x+y) z; //推導結果爲int。z的類型爲int。 return 0; }
-
如果需要寫一個模板函數實現加法運算,你可能需要這樣寫:
template<typename R, typename T, typename U> R add(T x, U y) { return x+y; } int main() { cout<<add<int,int> (1,2); return 0; }
這樣寫會顯得很冗長,複雜,在C++11中,可以寫成如下形式:
template<typename T, typename U> auto add(T x, U y) -> decltype(x+y) { return x+y; } int main() { cout<<add<int,int> (1,2); return 0; }
當然,在C++14中,可以寫的更精簡:
template<typename T, typename U> auto add(T x, U y) { return x+y; } int main() { cout<<add<int,int> (1,2); return 0; }
或者乾脆去掉模板:
auto add(auto x, auto y) { return x+y; } int main() { cout<<add(1.1,2); return 0; }