auto和decltype的用法總結


一, auto

1, auto的作用
    一般來說, 在把一個表達式或者函數的返回值賦給一個對象的時候, 我們必須要知道這個表達式的返回類型, 但是有的時候我們很難或者無法知道這個表達式或者函數的返回類型. 這個時候, 我們就可以使用auto關鍵字來讓編譯器幫助我們分析表達式或者函數所屬的類型. 比如:
auto item = val1 + val2;
auto red = LayerColor::create(Color4B(255, 100, 100, 255), 200, 100);
    如果val1和val2都是int類型, 那么item也是int類型, 如果val1和val2是double類型, 那么item就是double類型. 而create()的返回值類型有可能會很復雜, 我們可以不用管, 這就使我們編程更加方便簡單
 
2, auto和const
    auto會忽略掉頂層const, 保留底層const.  舉例:
const int i = 5;
auto a = i;        // 變量i是頂層const, 會被忽略, 所以b的類型是int
auto b = &i;    // 變量i是一個常量, 對常量取地址是一種底層const, 所以b的類型是const int *
    因此, 如果希望推斷出的類型是頂層const的, 那么就需要在auto前面加上cosnt:
const auto c = i;
 
3, auto和引用
① 如果表達式是引用類型, 那么auto的類型是這個引用的對象的類型.
int i = 2, &ri = i;
auto k = ri;            // k是int類型, 而不是引用類型

② 如果要聲明一個引用, 就必須要加上&, 如果要聲明為一個指針, 既可以加上*也可以不加*

int i = 3;
auto &refi = i;        // refi是一個int類型的引用
auto *p1 = &i;       // 此時推斷出來的類型是int, p1是指向int的指針
auto p2 = &i;        // 此時推斷出來的類型是int*, p2是指向int的指針

 

二, decltype
1, decltype的作用
    decltype只是為了推斷出表達式的類型而不用這個表達式的值來初始化對象.
decltype(func()) sum = x; // sum的類型是函數func()的返回值的類型, 但是這時不會實際調用函數func()
int i = 0;
decltype(i) j = 4; // i的類型是int, 所以j的類型也是int
 
2, decltype和const
    不論是頂層const還是底層const, decltype都會保留   
const int i = 3;
decltype(i) j = i; // j的類型和i是一樣的, 都是const int
 
3, decltype和引用
① 如果表達式是引用類型, 那么decltype的類型也是引用
const int i = 3, &j = i;
decltype(j) k = 5; // k的類型是 const int &
② 如果表達式是引用類型, 但是想要得到這個引用所指向的類型, 需要修改表達式:
int i = 3, &r = i;
decltype(r + 0) t = 5; // 此時是int類型
③ 對指針的解引用操作返回的是引用類型
int i = 3, j = 6, *p = &i;
decltype(*p) c = j; // c是int類型的引用, c和j綁定在一起
④ 如果一個表達式的類型不是引用, 但是我們需要推斷出引用, 那么可以加上一對括號, 就變成了引用類型了
int i = 3;
decltype((i)) j = i; // 此時j的類型是int類型的引用, j和i綁定在了一起

 

 
 
 
 


免責聲明!

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



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