1.編譯器通過分析表達式的類型來確定變量的類型,所以auto定義的變量必須有初始值。
auto i=10; //ok,i為整型 auto j; //error,定義時必須初始化。 j=2;
2.auto可以在一條語句中聲明多個變量,但該語句中所有變量的初始值類型必須有一樣。
auto i=0,*P=&i; //ok,i是整數,p是整型指針 auto a=2,b=3.14; //error,a和b類型不一致
3.auto會忽略掉頂層const,同時底層const則會保留下來
const int a=2,&b=a; auto c=a; //a是int 型,而不是const int,即忽略了頂層const auto d=&a; //d是一個指向const int 的指針,即保留了底層const
如果希望auto類型是一個頂層const ,需要明確指出:
const auto e=a; //e是const int 類型
4.當使用數組作為auto變量的初始值時,推斷得到的變量類型是指針,而非數組
int a[10]={1,2,3,4,5,6,7,8,9,0} auto b=a; //b是int *類型,指向數組的第一個元素 int c[2][3]={1} auto d=c; //d是int(*d)[3]類型的數組指針 for(auto e:c) //e是int*類型,而不是int(*)[3] for(auto &f:c) //f是int(&f)[3] //************************************************** decltype (a) c; //c是由10個整型數構成的數組,c[10]
decltype和auto功能類型,但略有區別:
1.decltype根據表達式類型確定變量類型,但不要求定義時進行初始化
int a=2; decltype (a) b; //b是int類型 b=3; int &c=a; decltype (c) d=a; //d為int &類型,因此定義時必須初始化
2.解引用指針操作將得到引用類型
int a=2,*b=a; decltype (*b) c=a; //解引用,c是int &類型,因此必須初始化
3.decltype所用的表達式加()得到的是該類型的引用
int a=2; decltype ((a)) b=a; //b是int&類型,而不是int類型,必須初始化 decltype (a) c; //c是int類型
4.decltype所用變量時數組時,得到的同類型的數組,而不是指針
int a[2]={1,2} decltype (a) b={3,4} //int b[2]類型
5.decltype所用變量是函數時,得到的是函數類型,而不是函數指針
int fun(int a); decltype(fun) *f(); //函數f返回的是 int(*)(int),即函數指針,而decltype(fun)是int(int)類型