C++14標準最近剛被通過,像以前一樣,沒有給這個語言帶來太大變化,C++14標準是想通過改進C++11 來讓程式設計師更加輕鬆的程式設計,C++11引入auto關鍵字(嚴格來說auto從C++ 03 開始就有了,只是C++11改變了auto的含義),auto讓你的程式碼更加乾淨,更容易讓你避免錯誤,舉個例子
原來你必須這樣寫
1 2 |
int i = 1; std::complex<double> c = return_a_complex_number(); |
你現在可以這樣寫
1 2 |
auto i = 1; auto c = return_a_complex_number(); |
宣告為auto的變數在編譯時期就分配了記憶體,而不是到了執行時期,所以使用auto不再引發任何速度延遲,這也意味著使用auto的時候,這個變數不初始化會報錯。因為編譯器無法知道這個變數的型別。
1 |
auto i; // this will rise a compilation error |
C++11中一個做的不好的地方是,你不能使用auto來定義一個函式型別,在新的標準中你就可以了:
1 2 3 4 5 |
// Error in C++11, works in C++14 auto my_function() { ... return value; } |
只要你的函式返回一個值,編譯器就知道怎麼解釋這個auto關鍵詞。現在,你可以使用最新版本的Clang和GCC,
1 |
g++-4.9.1 -Wall -std=c++14 -pedantic my_prog_name.cpp -o my_prog_name |
為了更好地使用auto來簡化你的程式碼,讓我們分別使用C++98 、C++11 和C++14 來實現同一段程式碼,為了說明,我們使用兩個函式來改變一個vector變數
1 |
multiply_by_two(add_one(my_vector)); |
很明顯,這個迴圈給一個vector變數的每一個值加一再乘以二 你可以寫一個函式,而不是兩個。這裡我們不是為了追求效能,而是說明auto的用法。
在C++98中你要這樣寫
1 2 3 4 5 6 7 8 9 10 11 12 |
std::vector<int>& add_one(std::vector<int> &v) { for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) { *it += 1; } return v; } void multiply_by_two(std::vector<int> &v) { for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) { *it *= 2; } } |
上面的程式碼顯得很囉嗦
在C++11中你可以這樣寫
1 2 3 4 5 6 7 8 9 10 11 12 |
std::vector<int>& add_one(std::vector<int> &v) { for(auto& it : v) { it += 1; } return v; } void multiply_by_two(std::vector<int> &v) { for(auto& it : v) { it *= 2; } } |
C++11 中顯然有了進步,我們這是可以使用auto來簡化迴圈時候的一點程式碼。但仍顯囉嗦。
在C++14中你可以使用auto來定義一個函式型別,程式碼可以簡化為這樣:
1 2 3 4 5 6 7 8 9 10 11 12 |
auto& add_one(std::vector<int>& v) { for(auto& it : v) { it += 1; } return v; } void multiply_by_two(std::vector<int>& v) { for(auto& it : v) { it *= 2; } } |
這裡是完整程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// C++14 "auto" demo code #include <iostream> #include <vector> auto& add_one(std::vector<int>& v) { for(auto& it : v) { it += 1; } return v; } void multiply_by_two(std::vector<int>& v) { for(auto& it : v) { it *= 2; } } void print_vec(const std::vector<int>& v) { for(const auto& e: v) { std::cout << e << std::endl; } std::cout << std::endl; } int main() { // Add one and multiply by two a vector of integers std::vector<int> my_vector{-1, 2, 3, 5}; multiply_by_two(add_one(my_vector)); print_vec(my_vector); return 0; } |
你可以清晰的對比出,C++14比C++11 有了一點進步。