auto和decltype的區別

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. 區別

  1. 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; //錯誤,引用必須初始化
  1. decltype (())的結果永遠是引用
int i = 0;
decltype ((i)) j = 21; //j的類型爲int &
  1. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章