auto和decltype
- auto
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; //c是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
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)类型