類型說明符 auto & 類型指示符 decltype

類型說明符 auto & 類型指示符 decltype

#include <iostream>
using namespace std;
/**
auto
    1,類型說明符,讓編譯器自己去分析,通過初始值來推算變量的類型;
    2.因此他的定義必須要有初始值
    3.可以一行裏定義多個變量,用逗號隔開。當然這些變量的類型必須一致
    4.用引用變量去推斷auto的類型時,會將引用的那個對象的類型作爲auto的類型
    5.auto會忽略掉頂層const.想要讓他加上頂層的const,在aout的時候就加上
    6.然鵝讓人難受的是如果你用auto聲明一個引用,他又會保持原變量的所有定義的類型
decltype:
    1.有時候我們希望從一個變量推斷出要定義的類型,但不想用這個變量來初始化這個要定義的變量,就用decltype
    2.這時decltype他只單純的判斷其類型,並不會計算表達式的值,且貌似無法在判斷類型前修改其表達式裏變量的值
    3,decltype在引用和const裏他會全盤接受(完完全全和裏面的變量,表達式的類型一樣)
*/
auto a=1, b=a,*c=&a;
//auto d=1,e=1.1;//錯誤,必須是同一個類型

decltype(a++) ad=10,bd=ad,*cd=&ad;
//decltype(f()) wuliao;//並不運行函數,只推出函數的返回值

int &dd=a;
int const *const fd=&a;
decltype(dd) ed=b;//ed是一個引用必須給他賦初值
decltype(fd) gd=&a;//gd是一個int const *const
decltype(dd+1) hd=4;//雖然dd是一個引用,但是dd+1表達式是一個int型,所以hd是一個int
decltype(*cd) kd=a;//你以爲你解引用了一個int,但他卻是一個引用(int &)....
decltype((a)) id=a;//這個操作真是叫人窒息,多加一個括號就成引用了。和下面那個一樣了,相當於強制給他搞了一個引用
decltype(a) &jd=a;

int main(void)
{

    cout<<a<<endl;
////////44444//////////////////////////
    const int &g=a;
    auto f=g;
 ////////5555///////////////////////
    const int * const h=&a;
    const int h2=3;
    auto j=h;
    auto j2=h2;
    /**
    按理來說,這裏j推測的類型應該是和h一樣
    是const int *const,然而他掉了頂層const
    想要讓j達到和h一樣的類型,在前面再加一個const
    */
    j+=1;
//    *j+=1;
    j2++;

    const auto j3=h;
//    j3+=1;
//    *j3+=1;
//////6666666666//////////////////////
    auto &k=h;
//    h++;
//    *h+=1;
/////////////////////////////////////

    cout<<"qwe"<<endl;

	return 0;
}
/*初次看到有大佬在C++裏用auto還以爲是c99裏的自動
現在才知道這個用法 已經被刪除了。。。
變成了上面的那個用法。。。。
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章