類型說明符 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裏的自動
現在才知道這個用法 已經被刪除了。。。
變成了上面的那個用法。。。。
*/