国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++11新特性中auto 和 decltype 區別和聯系

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

2021-04-28 14:42C++教程網 C/C++

這篇文章主要介紹了C++11新特性中auto 和 decltype 區別和聯系的相關資料,需要的朋友可以參考下

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

一. auto簡介

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

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

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

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

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

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

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

?
1
2
3
4
5
6
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,需要明確指出:

?
1
const auto f = ci;

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

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

二. decltype簡介

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

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

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

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

三. decltype 和 auto 區別

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

?
1
2
3
4
5
6
7
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還有一些值得注意的地方,我們先來看看下面這段代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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就會返回引用類型:

?
1
2
3
4
int i = 42;
 
//decltype(i)  int 類型
//decltype((i)) int& 類型

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;
}

運行結果為:

?
1
2
3
4
5
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

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

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

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

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 操网| 黑人中文字幕一区二区三区 | 中文字幕av在线播放 | 久久久www成人免费无遮挡大片 | 国产精品不卡一区 | 一区二区三区视频 | 精品九九| 国产精品三区在线 | 欧美一级片在线 | 色婷婷久久一区二区三区麻豆 | 欧美日韩精品一区 | 羞羞视频免费看 | www.久久99 | 在线观看欧美一区 | 久久久免费视频看看 | 免费视频一区 | 亚洲国产二区 | 天天碰天天操 | 欧洲精品视频在线观看 | 亚洲精品中文字幕在线观看 | 一区二区三区在线视频播放 | 久久久精品久久久 | 久久久久久久久久一区二区 | 另类五月 | 激情综合五月 | 午夜精品一区二区三区免费视频 | 国产欧美日韩综合精品一区二区 | 国产人成精品一区二区三 | 国产在线小视频 | 欧美一区二区三区电影 | 婷婷精品久久久久久久久久不卡 | 亚洲第一成年人视频 | 在线视频不卡一区 | 欧美一级网站 | 亚洲精品久久久久久国产精华液 | 日韩在线观看中文字幕 | 天天干天天看天天操 | 亚洲精品一区二区三区精华液 | 成人资源在线观看 | 成人精品综合 | 91精品国产乱码久久久久久久久 |