C++ auto自動類型推導規則和使用詳解

一.auto推導規則4點

(1) 引用不是類型,因此auto不能推斷出引用

int a = 1;
int& b = a;// b-> int&  用->表示推導出類型,下同
auto c = b;// c->int  

(2)auto 在推斷引用的類型時,會直接將引用替換為引用指向的對象。

引用不是對象,任何引用的地方都可以直接替換為引用指向的對象。

int a = 10;
const int& b = a ;// b-> const int&
auto c = b;  //  c-> int 
//相當於 auto c = a; 

由於在傳遞值時,修改這個值不會對原有的數據造成影響,而傳遞引用時,修改這個值會對修改原有的數據。

(3)auto 關鍵字推斷類型時,如果沒有引用符號,那麼會忽略值類型的const修飾,而保留修飾指向對象的const

const int i =1;
auto j = i;//j-> int
int a ;
const int* const pi = &a;//第一個const 修飾指針的指向的對象,第二個const修飾pi指向的值。
                         //會忽略第二個const。
auto pi2 = pi;  // pi2 -> int* const 

(4)如果有引用符號,那麼值類型的const和指向的const都會保留。

int i = 1;
const int* const j = &i;
auto &k = j; //a->const int const &

具體推導例子:

int x = 10;

  推導表達式: 推導出變量數據類型: auto被推導的類型:
1 auto  *a = &x;      a   被推導為 :int * auto 推導為: int
2 auto  b =  &x;      b  被推導為: int* auto 推導為: int *
3 auto &c = x ;      c  被推導為:   int& auto 推導為: int
4 auto d = c;      d 被推導為:  int auto 推導為: int
5 const auto e= x;      e 被推導為: const int auto 推導為:    int
6 auto f = e;      f 被推導為: int auto 推導為:    int
7 const auto& g = x;      g 被推導為: const int& auto 推導為:    int
8 auto& h = g;       h 被推導為:const int& auto 推導為:    int

註意: auto聲明的變量必須馬上初始化,因為在編譯階段編譯器就將其類型推導出來。

auto a;error

二.auto的使用時機

(1)用於推導容器的迭代器:

原本不使用類型推導我們對容器的遍歷:

for(vector<int>::iterator it = vec.begin(); it! = vec.end(); it++)
{
    cout<<"vec:"<< *it <<endl;
}

使用auto自動類型推導後對容器的遍歷:

for(auto it = vec.begin(); it! = vec.end(); it++ )
{
    cout>>"vec:"<<*it<<endl;
}

是不是清爽瞭很多,利用auto自動類型推導,就不需要寫一堆迭代器類型瞭。

(2)書寫泛性函數

不知道程序使用時,傳入的參數是什麼類型時,用auto可以為我們節省不少工作量。

(3)用於函數的返回值類型後置:

和decltypr配合使用,在後文講述。

到此這篇關於C++ auto自動類型推導規則和使用詳解的文章就介紹到這瞭,更多相關C++自動類型推導內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: