亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++11新特性中auto 和 decltype 區別和聯系

2020-05-23 13:53:43
字體:
來源:轉載
供稿:網友

C++11新特性中auto decltype 區別和聯系

一. auto簡介

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

//由val_1 和val_2相加的結果可以推斷出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也能在一個語句中聲明多個變量,因為一個聲明雨具只能有一個基本數據類型,所以該雨具所有變量的初始基本數據類型都必須是一樣的。在這里一定要區別數據類型和類型修飾符!!

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

            編譯器推斷出來的auto類型有時候會跟初始值的類型并不完全一樣,編譯器會適當的改變結果類型使得其更符合初始化規則。

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

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

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

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

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

const auto f = ci; 

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

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

二. decltype簡介

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

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

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

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

三. decltype 和 auto 區別

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

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. 

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

           decltype和auto還有一處重要的區別是,decltype的結果類型與表達形式密切相關。有一種情況需要特別注意:對于decltype 所用表達式來說,如果變量名加上一對括號,則得到的類型與不加上括號的時候可能不同。如果decltype使用的是一個不加括號的變量,那么得到的結果就是這個變量的類型。但是如果給這個變量加上一個或多層括號,那么編譯器會把這個變量當作一個表達式看待,變量是一個可以作為左值的特殊表達式,所以這樣的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; } 

運行結果為:

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

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区二区三区久久狼黑人| 日韩av片永久免费网站| 欧美亚洲一区在线| 日韩视频在线一区| 日韩**中文字幕毛片| 国产精品久久久久久久久久久新郎| 亚洲变态欧美另类捆绑| 久久久91精品| 日韩美女视频中文字幕| 正在播放国产一区| 国产在线日韩在线| 亚洲精品国产拍免费91在线| 亚洲精品久久视频| 亚洲国产精品成人一区二区| 亚洲女人被黑人巨大进入| 欧美激情一区二区三区成人| 国产一区在线播放| 一夜七次郎国产精品亚洲| 中文日韩在线观看| 亚洲国产精品99久久| 亚洲激情视频在线观看| 98视频在线噜噜噜国产| 国产欧美日韩专区发布| 国产成人精品视频在线观看| 国产精品自拍偷拍| 日韩精品在线电影| 欧美成人小视频| 国产精品亚洲欧美导航| 日韩电影大全免费观看2023年上| 国产精品麻豆va在线播放| 中文字幕亚洲一区| 91在线|亚洲| 九九热这里只有在线精品视| 亚洲国产高清高潮精品美女| 亚洲最新av在线网站| 一区二区日韩精品| 精品五月天久久| 国产午夜精品一区二区三区| 情事1991在线| 国产成人久久久精品一区| 欧美一区二区三区四区在线| 亚洲精品美女免费| 欧美激情精品久久久久久久变态| 亚洲国产精品高清久久久| 国产精品高潮视频| 97**国产露脸精品国产| 97精品国产91久久久久久| 91产国在线观看动作片喷水| 欧美夜福利tv在线| 在线免费观看羞羞视频一区二区| 日韩视频精品在线| www日韩欧美| 国内免费久久久久久久久久久| 亚洲欧美另类中文字幕| 日韩不卡中文字幕| 中文字幕成人在线| 91精品国产综合久久香蕉最新版| 欧美国产日韩一区二区在线观看| 国产成人在线一区二区| 国产精品aaaa| 91色琪琪电影亚洲精品久久| 久久天天躁日日躁| 亚洲伊人久久综合| 日韩中文在线观看| 川上优av一区二区线观看| 国产97人人超碰caoprom| 亚洲综合精品一区二区| 国语自产精品视频在线看| 国内外成人免费激情在线视频| 亚洲第一精品自拍| 中文字幕亚洲国产| 国内精品久久久久影院 日本资源| 成人欧美一区二区三区黑人孕妇| 综合av色偷偷网| 成人淫片在线看| 国产精品久久久久久一区二区| 久久精品亚洲精品| 久久国产精品首页| 国产丝袜精品第一页| 色www亚洲国产张柏芝| 国产精品久久久久福利| 98精品国产自产在线观看| 亚洲一区二区三区xxx视频| 日韩精品中文字幕有码专区| 97国产精品视频人人做人人爱| 日本亚洲精品在线观看| 欧美成人一区二区三区电影| 上原亚衣av一区二区三区| 成人网欧美在线视频| 一区二区三区视频免费在线观看| 亚洲精品色婷婷福利天堂| 97婷婷大伊香蕉精品视频| 亚洲韩国日本中文字幕| 日韩中文字幕在线免费观看| 欧美激情精品久久久久| 日韩激情视频在线| 亚洲精品国产拍免费91在线| 久久精品视频在线播放| 欧美福利视频在线| www.欧美精品| 日韩精品极品在线观看播放免费视频| 一本大道亚洲视频| 美女少妇精品视频| 亚洲午夜精品视频| 国产精品自产拍高潮在线观看| 日韩欧美第一页| 亚洲国产精彩中文乱码av在线播放| 亚洲精品720p| 久久久久久久久电影| 国产日韩欧美影视| 97精品欧美一区二区三区| 国产欧美日韩精品专区| 超碰日本道色综合久久综合| 国产日韩在线精品av| 亚洲天堂网站在线观看视频| 成人黄色生活片| 国产成人自拍视频在线观看| 国产精品美女久久久久久免费| 国产精品露脸自拍| 久久久欧美一区二区| 亚洲欧美日韩第一区| 久久69精品久久久久久久电影好| 91免费福利视频| 搡老女人一区二区三区视频tv| 欧美日韩在线观看视频小说| 91精品国产综合久久香蕉最新版| 亚洲视频在线免费观看| 欧美大片欧美激情性色a∨久久| 亚洲美女黄色片| 亚洲三级黄色在线观看| 亚洲xxxx做受欧美| 国产精品久久久久久久电影| 日韩免费看的电影电视剧大全| 日韩国产精品一区| 色婷婷av一区二区三区久久| 亚洲精品ady| 国产精品丝袜久久久久久高清| 欧美二区在线播放| 日韩精品在线免费观看视频| 插插插亚洲综合网| 亚洲欧美日韩网| 国产日韩欧美另类| 精品无人区乱码1区2区3区在线| 亚洲精品乱码久久久久久金桔影视| 欧美日韩午夜激情| 亚洲在线观看视频| 欧美日韩高清区| 2019中文字幕全在线观看| 亚洲视频电影图片偷拍一区| 激情成人中文字幕| 91美女片黄在线观| 精品视频9999| 久久久久久亚洲精品中文字幕| 国产视频自拍一区| 人人做人人澡人人爽欧美| 国产精品视频网| 亚洲综合最新在线| 色阁综合伊人av| 在线日韩欧美视频| 亚洲精品自拍偷拍| 亚洲国产美女精品久久久久∴| 久久久久久久爱| 国产精品自产拍在线观| 成人精品久久久|