c++11中引入了auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別,auto讓編譯器通過初始化值來推算變數的型別。
如:auto item = vall + val2;
此處編譯器將根據vall和val2相加的結果來推斷item的型別,假如vall和val2的型別是double,則item的型別就是double.
auto一般會忽略頂層const,同時底層const則會保留下來
> 頂層const表示任意的物件是常量。如頂層const指標就是乙個常量指標,底層const指標則表示指標所指的物件是乙個常量
舉個例子:
int i = 0; &r = i;
const int ci = i;
auto b = ci; //b是乙個整數(ci的頂層const特性被忽略掉了)
如果希望推斷出的auto型別是乙個頂層const,需要明確指出:
const anto f = ci;//f的推演型別是int , f是const int
c++11新標準引入了第二種型別說明符decltype,它的作用是選擇並返回運算元的資料型別。在此過程中,編譯器分析表示式並得到它的型別,卻不實際計算表示式的值
如:decltype(f()) sum = x; //sum的型別就是函式f的返回型別。
編譯器並不實際呼叫f,而是使用當呼叫發生時f的返回值型別作為sum的型別
此外,decltype處理頂層const和引用的方式與auto有些不同。
decltype保留頂層const
舉個例子:
const int ci = 0, &cj = ci;
decltype(ci) x = 0; //x的型別是const int
decltype(cj) y = x; //y的型別是const int&,y繫結到變數x
如果decltype使用的表示式不是乙個變數,則decltype返回表示式結果對應的型別。
如:
int i = 42, *p = &i, &r = i;
decltype(r + 0) b;// r + 0的結果是乙個int值,因此b是乙個未初始化的int
decltype(*p) c;// 錯誤的作法:c 是 int&, 必須初始化
如果decltype的表示式是加上了括號的變數,結果將是引用。
如:
int i = 42;
decltype((i)) d;//錯誤: d是int&,必須初始化
decltype(i) e; //正確:e是乙個未初始化的int
decltype(i) 結果只有當i本身就是乙個引用時才是引用,delcltype((i))結果永遠是引用。
auto與decltype區別主要三個方面:
1.auto型別說明符用編譯器計算變數的初始值來推斷其型別,而decltype讓編譯器分析表示式並得到它的型別,但是不實際計算表示式的值。
2.auto一般會忽略掉頂層const,而把底層const保留下來。與之相反,decltype會保留變數的頂層const。
3.decltype結果型別與表示式密切相關,如果使用不加括號的變數,得到的結果就是變數本身的型別,如果給變數加了一層或者多層括號,則編譯器將推斷得到引用型別。
C語言11中的auto和decltype
c語言11中的auto和decltype 2012 12 17 00 00 中國it實驗室佚名 關鍵字 c語言 c 11中引入的auto主要有兩種用途 自動型別推斷和返回值佔位。auto在c 98中的標識臨時變數的語義,由於使用極少且多餘,在c 11中已被刪除。auto自動型別推斷,用於從初始化表示...
auto 和 decltype的區別
auto和decltype都是型別推斷的兩種方式,但之間又有區別。主要有這幾個方面的區別 1.auto是通過編譯器計算變數的初始值來推斷型別的,decltype同樣也是通過編譯器來分析表示式進而得到它的型別,但是它不用將表示式的值計算出來。2.編譯器推斷出來的auto型別有可能和初始值型別不同,比如...
auto 和 decltype 的區別
auto 和 decltype 都是型別推斷的方式 區別如下 1 auto 是通過編譯器計算變數的初始值來推斷型別,decltype同樣也是通過編譯器來分析表示式進而得到它的型別,但是它不用將表示式的值計算出來 2 編譯器推斷出來的auto型別可能與初始值型別不同,眾多周知,使用引用實際是使用引用的...