系列文章目錄
C++11新特性使用詳解-持續更新
文章目錄
- 系列文章目錄
- 前言
- 一、auto關鍵字
- 1.根據變量的初始化表達式來推導變量的類型
- 2.const與引用
- 二、decltype關鍵字
- 1.推斷表達式的類型
- 2.const與引用
- 三、總結
前言
auto和decltype是C++11引入的倆個重要的新關鍵字,用于在編譯期自動推導出變量或表達式的類型。極大提高代碼的可讀性和簡潔性,并且有助于減少類型轉換錯誤。
一、auto關鍵字
編程時常常需要把表達式的值賦給變量,這就要求變量申明時必須清楚知道表達式的類型。做到這點不容易或者根本做不到。為了解決這個問題,C++11引入auto關鍵字讓編譯器自動推導變量的類型。
1.根據變量的初始化表達式來推導變量的類型
auto a = 1; // a的類型為int
auto b = 5.20; // b的類型為double
auto c = "auto"; // c的類型為const char[6]
auto person1 = Person(); // person1的類型為Person,并且自動初始化成員變量變量
auto person2 = Person{ "Fei", 30 }; // person2的類型為Person,并且根據指定的初始值初始化成員變量變量std::vector<int> vec = { 1, 2, 3, 4, 5 };
for (auto it = vec.begin(); it != vec.end(); ++it) { // 在for循環中使用auto推導類型std::cout << *it << " ";
}
2.const與引用
使用引用其實是使用引用的對象。特別是當引用被當作初始值時,正在參與初始化的是引用對象的值。此時編譯器以引用對象的類型作為auto的類型。
int i = 10, &r = i;
auto aa = r; //推導出aa類型是int:r是i的別名,i是int(正在參與初始化的是引用對象的值,以引用對象的值作為auto的類型)//auto一般會忽略頂層const,同時底層const則會被保留
const int ci = i, &cr = ci;
auto bb = ci; //推導出bb類型是int(ci的頂層const特性被忽略了)
auto cc = cr; //推導出cc類型是int(cr是ci的別名,ci本身是一個頂層const)
auto dd = &i; //推導出cc類型是int*
auto ee = &ci; //推導出cc類型是const int*(對常量對象取地址是一種底層const)//如果希望auto推斷出來的類型是一個頂層的const,需要明確指出
const auto ff = ci; //推導出b類型是int//設置類型為auto的引用是,初始值中的頂層常量屬性任然保留
auto &gg = ci; //推導出b類型是const int&
二、decltype關鍵字
希望從表達式的類型中推導除要定義的變量的類型,但是不想用該表達式的值初始化變量。為了滿足這各要求,C++11引入decltype關鍵字讓編譯器自動推導表達式的類型,而不用計算表達式的值。
1.推斷表達式的類型
int x = 10;
decltype(x) y; //y的類型是intdouble foo();
decltype(foo()) z; //z的類型是double,根據函數返回值類型推導
2.const與引用
decltype處理頂層const和引用的方法和auto不同。
如果表達式是一個引用類型,decltype會去除引用,推導出引用所引用的類型。
例如,對于表達式int& x, decltype(x)的推導結果是int,去除了引用。
需要注意的是,decltype推導出的類型會保留頂層const限定符和volatile限定符,不會去除它們。
const int cii = 10, &cjj = cii;
decltype(cjj) xx = 0; //x的類型是const int&
decltype(cjj) yy = xx; //x的類型是const int&,y綁定到x
//decltype(cjj) zz; //錯誤: z是個引用,必須初始化int xxx = 0;
decltype(xxx) pp = 0;
三、總結
在不影響代碼可讀性的前提下可以盡可能的使用auto。復雜類型用auto,但是簡單內置類型就沒有必要使用auto了。總之避免過度使用auto和decltype,以保持代碼的可讀性和維護性。