auto 和 decltype 的區別


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM