欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系

 更新時間:2017年01月20日 11:43:53   投稿:lqh  
這篇文章主要介紹了C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下

C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系

一. auto簡介

編程時候常常需要把表達式的值付給變量,需要在聲明變量的時候清楚的知道變量是什么類型。然而做到這一點并非那么容易(特別是模板中),有時候根本做不到。為了解決這個問題,C++11新標準就引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_式所屬的類型。和原來那些只對應(yīng)某種特定的類型說明符(例如 int)不同。auto 讓編譯器通過初始值來進行類型推演。從而獲得定義變量的類型,所以說 auto 定義的變量必須有初始值。

//由val_1 和val_2相加的結(jié)果可以推斷出item的類型 
auto item = val_1 + val_2;//item 類型初始化為val_1 + val_2相加后的類型,值為val_1+val_2相加的值。 

    這里的 item 的類型是編譯器在編譯的過程中通過val_1和val_2的類型相加后推算出來的。假如是val_1(int) + val_2(double),那么item的類型就是double.

            使用auto也能在一個語句中聲明多個變量,因為一個聲明雨具只能有一個基本數(shù)據(jù)類型,所以該雨具所有變量的初始基本數(shù)據(jù)類型都必須是一樣的。在這里一定要區(qū)別數(shù)據(jù)類型和類型修飾符!!

int i = 3; 
auto a = i,&b = i,*c = &i;//正確: a初始化為i的副本,b初始化為i的引用,c為i的指針. 
auto sz = 0, pi = 3.14;//錯誤,兩個變量的類型不一樣。 

            編譯器推斷出來的auto類型有時候會跟初始值的類型并不完全一樣,編譯器會適當?shù)母淖兘Y(jié)果類型使得其更符合初始化規(guī)則。

            首先,正如我們熟知的,使用引用其實是使用引用的對象,特別當引用被用作初始值的時候,真正參與初始化的其實是引用對象的值。此時編譯器以引用對象的類型作為auto的類型:

int i = 0 ,&r = i;//定義一個整數(shù)i,并且定義r為i的應(yīng)用. 
auto a = r; //這里的a為為一個整數(shù),其值跟此時的i一樣. 

            由此可以看出auto會忽略引用,其次,auto一般會忽略掉頂層const,但底層const會被保留下來,比如當初始值是一個指向常量的指針時:

int i = 0; 
const int ci = i, &cr = ci; //ci 為整數(shù)常量,cr 為整數(shù)常量引用  
auto a = ci;   // a 為一個整數(shù), 頂層const被忽略 
auto b = cr;   // b 為一個整數(shù),頂層const被忽略 
auto c = &ci;  // c 為一個整數(shù)指針. 
auto d = &cr;  // d 為一個指向整數(shù)常量的指針(對常量對象區(qū)地址是那么const會變成底層const) 

            如果你希望推斷出auto類型是一個頂層的const,需要明確指出:

const auto f = ci; 

            還可以將引用的類型設(shè)為auto,此時原來的初始化規(guī)則仍然適用(用于引用聲明的const都是底層const):

auto &g = ci; //g是一個整數(shù)常量引用,綁定到ci。 
auto &h = 42; // 錯誤:非常量引用的初始值必須為左值。 
const auto &j = 42; //正確:常量引用可以綁定到字面值。  

二. decltype簡介

            有的時候我們還會遇到這種情況,我們希望從表達式中推斷出要定義變量的類型,但卻不想用表達式的值去初始化變量。還有可能是函數(shù)的返回類型為某表達式的的值類型。在這些時候auto顯得就無力了,所以C++11又引入了第二種類型說明符decltype,它的作用是選擇并返回操作數(shù)的數(shù)據(jù)類型。在此過程中,編譯器只是分析表達式并得到它的類型,卻不進行實際的計算表達式的值。

decltype(f()) sum = x;// sum的類型就是函數(shù)f的返回值類型。 

在這里編譯器并不實際調(diào)用f函數(shù),而是分析f函數(shù)的返回值作為sum的定義類型。

 基本上decltype的作用和auto很相似,就不一一列舉了。對于decltype還有一個用途就是在c++11引入的后置返回類型。

三. decltype 和 auto 區(qū)別

            decltype在處理頂層const和引用的方式與auto有些許不同,如果decltype使用的表達式是一個變量,則decltype返回該變量的類型(包括頂層const和引用在內(nèi))。

const int ci = 42, &cj = ci; 
 
decltype(ci) x = 0;  // x 類型為const int 
auto z = ci;     // z 類型為int 
 
decltype(cj) y = x;  // y 類型為const int& 
auto h = cj;     // h 類型為int 

           decltype還有一些值得注意的地方,我們先來看看下面這段代碼:

int i = 42, *p = &i, &r = i; 
 
decltype(i) x1 = 0;    //因為 i 為 int ,所以 x1 為int 
auto x2 = i;       //因為 i 為 int ,所以 x2 為int 
 
decltype(r) y1 = i;    //因為 r 為 int& ,所以 y1 為int& 
auto y2 = r;       //因為 r 為 int& ,但auto會忽略引用,所以 y2 為int 
 
decltype(r + 0) z1 = 0;  //因為 r + 0 為 int ,所以 z1 為int, 
auto z2 = r + 0;     //因為 r + 0 為 int ,所以 z2 為int, 
 
decltype(*p) h1 = i;   //這里 h1 是int&, 原因后面講 
auto h2 = *p;       // h2 為 int. 

           如果表達式的內(nèi)容是解引用操作,則decltype將得到引用類型。正如我們所熟悉的那樣,解引用指針可以得到指針所指對象,而且還可以給這個對象賦值。因此decltype(*p)的結(jié)果類型就是int&.

           decltype和auto還有一處重要的區(qū)別是,decltype的結(jié)果類型與表達形式密切相關(guān)。有一種情況需要特別注意:對于decltype 所用表達式來說,如果變量名加上一對括號,則得到的類型與不加上括號的時候可能不同。如果decltype使用的是一個不加括號的變量,那么得到的結(jié)果就是這個變量的類型。但是如果給這個變量加上一個或多層括號,那么編譯器會把這個變量當作一個表達式看待,變量是一個可以作為左值的特殊表達式,所以這樣的decltype就會返回引用類型:

int i = 42; 
 
//decltype(i)  int 類型 
//decltype((i)) int& 類型 

           這里再指出一個需要注意的地方就是 = 賦值運算符返回的是左值的引用。換句話意思就是說 decltype(i = b)  返回類型為 i 類型的引用。仔細看下面這段代碼:

int main() 
{ 
  int i = 42; 
 
  decltype(i = 41) x = i; 
 
  auto y = i; 
 
  auto& z = i; 
 
  printf("i x y z 此時為: %d %d %d %d\n", i,x,y,z); 
 
  i--; 
 
  printf("i x y z 此時為: %d %d %d %d\n", i, x, y, z); 
 
  x--; 
 
  printf("i x y z 此時為: %d %d %d %d\n", i, x, y, z); 
 
  y--; 
 
  printf("i x y z 此時為: %d %d %d %d\n", i, x, y, z); 
 
  z--; 
 
  printf("i x y z 此時為: %d %d %d %d\n", i, x, y, z); 
 
  return 0; 
} 

運行結(jié)果為:

i x y z 此時為: 42 42 42 42
i x y z 此時為: 41 41 42 41
i x y z 此時為: 40 40 42 40
i x y z 此時為: 40 40 41 40
i x y z 此時為: 39 39 41 39

     由上面的代碼和運行結(jié)果可以看出來,1.decltype(i = 41)中的賦值語句并沒有真正的運行。2. decltype(i = 41)返回的其實是int&,也就是說x 其實是 i 的引用。

了解了auto 和 decltype后,以后在使用的過程中一定要分清兩者的區(qū)別,防止在定義的時候產(chǎn)生const 與非const 以及引用 與非引用 的差別!!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • C++實現(xiàn)猴子吃桃的示例代碼

    C++實現(xiàn)猴子吃桃的示例代碼

    這篇文章主要介紹了C++實現(xiàn)猴子吃桃的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找

    C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找

    這篇文章主要介紹了C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找方法,涉及數(shù)組的操作,有值得借鑒的技巧,需要的朋友可以參考下
    2014-09-09
  • C 語言基礎(chǔ)教程(我的C之旅開始了)[十]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[十]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[十]...
    2007-02-02
  • C語言進階棧幀示例詳解教程

    C語言進階棧幀示例詳解教程

    這篇文章主要為大家介紹了C語言進階棧幀的示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-02-02
  • C++移動語義介紹與使用講解

    C++移動語義介紹與使用講解

    首先,移動語義和完美轉(zhuǎn)發(fā)這兩個概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會從C++的值類型,到移動拷貝與移動賦值來理解移動語義與完美轉(zhuǎn)發(fā)
    2022-09-09
  • Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)

    Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)

    下面小編就為大家?guī)硪黄狶inux下C語言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • c語言的注釋定界符詳解

    c語言的注釋定界符詳解

    在本文里小編給大家分享的是關(guān)于c語言的注釋定界符知識點詳解,需要的朋友們可以跟著學習下。
    2020-02-02
  • c語言調(diào)用匯編的方法

    c語言調(diào)用匯編的方法

    在此記錄一下c調(diào)用匯編的方法,匯編使用的是AT&T語法。例子很簡單,就是在給一個整數(shù)用匯編轉(zhuǎn)換成二進制
    2013-11-11
  • C語言 模擬實現(xiàn)strcpy與strcat函數(shù)詳解

    C語言 模擬實現(xiàn)strcpy與strcat函數(shù)詳解

    這篇文章主要介紹了怎樣用C語言模擬實現(xiàn)strcpy與strcat函數(shù),strcpy()函數(shù)是C語言中的一個復制字符串的庫函數(shù),strcat()函數(shù)的功能是實現(xiàn)字符串的拼接
    2022-04-04
  • c++11 新特性——智能指針使用詳解

    c++11 新特性——智能指針使用詳解

    這篇文章主要介紹了c++11 新特性——智能指針使用的相關(guān)資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-02-02

最新評論