auto 和 decltype 的區別

2022-09-03 19:00:11 字數 1758 閱讀 8001

auto 和 decltype 都是型別推斷的方式

區別如下:

1、auto 是通過編譯器計算變數的初始值來推斷型別,decltype同樣也是通過編譯器來分析表示式進而得到它的型別,但是它不用將表示式的值計算出來

2、編譯器推斷出來的auto型別可能與初始值型別不同,眾多周知,使用引用實際是使用引用的物件,特別是當引用被用作初始值時,真正參與初始化的值其實是引用物件的值,此時編譯器以引用物件的型別作為auto的型別,比如對於頂層const,auto會忽略頂層const性質,但是decltype是保留下來的

int i = 0; &r = i;

auto a = r //a是乙個整數,r是i的別名,而i是乙個整數

const

int ci = i, &cr =ci;

auto b = ci; //

b是乙個整數(ci的頂層const特性被忽略了)

auto c = cr; //

c是乙個整數(cr是ci的別名,ci本身是乙個頂層cosnt)

auto d = &i; //

d是乙個整型指標(整數的位址就是指向整數的指標)

auto e = &ci; //

e是乙個指向常量整型的指標(對常量物件取位址是一種底層cosnt)

//如果希望推斷出的auto型別是乙個頂層const,需明確指出

const auto f = ci; //

ci的推斷型別為int,f是const int

//還可以將引用的型別設為auto

auto &g = ci; //

g是乙個整型常量引用,繫結到ci

auto &h = 42; //

錯誤:不能為非常量引用繫結字面值

cosnt auto &j = 42; //

正確:可以將常量引用繫結字面值

//設定乙個auto的引用時,初始值中的頂層常量仍然保留,如果要給初始值繫結乙個引用,則此時的常量就不是頂層常量了。

3、與auto不同,decltype的結果型別與表示式形式有密切關係,比如declytpe內層沒有括號得到的就是變數的型別,如果有多層括號,那麼返回的就是引用,具體可通過**分析

cosnt int ci = 0, &cj =ci;

decltype(ci) x = 0; //

x的型別是const int

deceltype(cj) y = x; //

y的型別是const int&,y繫結到變數x

decltype(cj) z; //

錯誤,z是乙個引用,必須初始化

//引用從來都作為其所指物件的同義詞出現,只有在decltype處是乙個例外

//decltype和引用

//如果decltype使用的表示式不是乙個變數,則decltype返回表示式結果對應的型別,decltype的返回值型別可以是引用型別

int i =42,*p = &i, &r =i;

decltype(r + 0) b; //

加法的結果時int,因此b是乙個未初始化的int

decltype(*p) c; //

錯誤做法:c是int& 必須初始化

//如果表示式的內容是解引用操作,則decltype將得到引用型別,解引用指標可以得到指標所指的物件,而且還能給這個物件賦值,因此decltype(*p)的結果型別就是int&,而非int

auto 和 decltype的區別

auto和decltype都是型別推斷的兩種方式,但之間又有區別。主要有這幾個方面的區別 1.auto是通過編譯器計算變數的初始值來推斷型別的,decltype同樣也是通過編譯器來分析表示式進而得到它的型別,但是它不用將表示式的值計算出來。2.編譯器推斷出來的auto型別有可能和初始值型別不同,比如...

C 中關鍵字auto和decltype的區別

c 11標準引入了auto和decltype型別說明符,它能讓編譯器幫我們去分析表示式所屬的型別。auto和decltype的主要區別有三個方面 第一,auto型別說明符用編譯器計算變數的初始值來推斷其型別,而decltype雖然也讓編譯器分析表示式並得到它的型別,但是不實際計算表示式的值。第二,編...

C 之decltype和auto的用法

返回值 decltype 表示式 1 當表示式返回右值,則decltype返回該表示式的型別 2 當表示式返回左值,則decltype返回該表示式的左值引用型別 注 auto的用法 1 自動型別推斷 templatet,class u void myfunc t t,u u 2 返回值佔位。函式模板...