c 中auto和decltype的區別

2021-09-17 20:22:59 字數 1901 閱讀 2403

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型別可能與初始值型別不同,眾多周知,使用引用實際是使用引用的...