C++ auto和decltype關鍵字
C++11新標準引入了auto和declty這兩個類型推斷關鍵字,auto的推斷是基本上針對賦值類型,而decltype則常常希望重表達式中推斷出要定義變量的類型,但是不想用該表達式的值初始化變量。
auto num = 21;//num爲int類型,初始值爲21
decltype (num) tmp;//tmp爲int類型
1. auto
auto可以在一個語句中聲明多個變量,但是其基本類型只能有一個
auto i = 0, j = 3.14; //錯誤,j的推斷爲double,而i是int
auto i = 0, *j = &i; //正確
2. 區別
- auto類型推斷的時候會忽略頂層const,保留底層const,而decltype都會保留, 頂層const和底層const一般針對的是指針和引用,頂層const表示指針本身是一個const,底層const表示指針對象所指的是一個常量,用於申明引用的const爲底層const。對於一般的基本類型,C++primer把它看作頂層const。
const int i = 0, &ri = i;
auto j = i; //j是一個整數,頂層const被忽略
auto k = ri; //k是一個整數,ri是i的別名,i本身是一個頂層const
auto m = &i; //m是一個整形指針
auto n = &ri; //n是一個指向整數常量的指針,對常量對象取地址是一種底層const
const int i = 0, &ri = i;
decltype (i) j = 0; //j的類型爲const int
decltype (ri) k = j; //k的類型爲const int &
decltype (ri) m; //錯誤,引用必須初始化
- decltype (())的結果永遠是引用
int i = 0;
decltype ((i)) j = 21; //j的類型爲int &
- decltype推斷的時候,針對引用類型,推斷的類型必須比初始化的類型更嚴格
int temp = 7;
const int i = 0, &ri = i;
decltype ((ri)) M = temp;//正確, M爲cosnt int &, temp爲int
decltype ((temp)) N = i; //錯誤, N爲int &, i爲const int
decltype (i) Z = ri; //正確,Z爲const int, ri爲i的引用爲const int
decltype ((i)) Z = ri; //正確,Z爲const int, ri爲i的引用爲const int