該文爲中國大學MOOC上北京郵電大學崔毅東和楊談老師主講的《C++程序設計(面向對象進階)》筆記整理
1. auto 關鍵字
1. auto
- C++03 及之前的標準中,auto 放在變量聲明之前,聲明變量的存儲策略,常省略不寫
- C++11 中,auto 關鍵字放在變量前,作用是在聲明變量的時候根據變量初始值類型自動爲此變量選擇匹配的類型
代碼示例:
auto x{ 1 };
auto y{ 1.1 };
auto z = "ss";
2. auto 的使用限制
-
auto 變量必須在定義時初始化
auto x1{ 1 }; // 正確 auto x2; // 錯誤,編譯器無法推導 x2 的類型 x2 = 10;
-
定義在一個 auto 序列的變量必須始終推導成同一類型
auto x1{10},x2{15}; // 正確 auto y1{12},y2{'c'}; // 錯誤,沒有推導爲同一類型
-
如果初始化表達式是引用或const,則去除引用或const語義
int x1{ 10 }; int& rx1 = x1; auto x = rx1; // 此時 x 的類型爲 int 而非 int& const int y1{ 10 }; auto y = y1; // 此時 y 的類型爲 int 而非 const int
-
如果 auto 關鍵字帶上 &,則不去除引用或const語義
int x1{ 10 }; int& rx1 = x1; auto& x = rx1; // 此時 x 的類型是 int& const int y1{ 10 }; auto& y = y1; // 此時 y 的類型是 const int&
-
初始表達式爲數組時,auto 關鍵字推導類型爲指針
int a[3]{ 1,2,3 }; auto b = a; // 此時 b 的類型是 int *
-
若表達式爲數組且 auto 帶上 &,則推導類型爲數組類型
int a[3]{ 1,2,3 }; auto& b = a; // 此時 b 的類型是 int[3] &
-
C++14中,auto 可以作爲函數的返回值類型和參數類型
#include<iostream> auto max(int x,int y) { // 返回值類型爲 auto return x > y ? x : y; } int main() { int x{ 1 }; int y{ 2 }; std::cout << max(1, 2) << std::endl; return 0; }
3. auto 使用建議
-
儘可能使用 auto,使用 auto 是爲了代碼的正確性、性能、可維護性、健壯性和方便,例如:保證在聲明變量時即初始化
auto x{ 1 }; auto y; // 必須聲明變量時初始化
-
當希望能在變量定義時,明確指出變量類型,且不希望隨便更改其類型時,可以使用如下方法:
auto x = int{ 1 }; // 初始化列表 auto y = float{ 2.f }; // 初始化列表 auto z = int{ 1.1 }; // 編譯器報錯,初始化列表不能窄化
-
當 auto 和初始化列表一起用,要避免在一行中使用列表初始化和拷貝列表初始化
auto x{ 1 }, y = { 2 }; // 編譯器報錯,因爲可能推導出不同類型
2. decltype 關鍵字
1. decltype
- decltype 利用已知類型聲明新類型
- decltype 是在編譯器推導表達式的類型,只做靜態分析,不會導致已知類型表達式執行
- decltype 主要用於泛型編程(模板)
代碼實例:
#include<iostream>
int func1() {
return 10;
}
auto func2() {
return 'a';
}
int main() {
decltype(func1()) x; // x 是 int 類型,func1() 並不會執行
decltype(func2()) y = func2();
return 0;
}
2. decltype與auto的對比
- auto 忽略最上層的 const,decltype 則保留最上層的 const
- auto 忽略原有類型的引用,decltype 則保留原有類型的引用
- 對解引用操作,auto 推斷出原有類型,decltype 推斷出引用
- auto 推斷時自動執行,decltype 不會執行,只做分析