1.auto
使用auto关键字来修饰变量时我们无需指出变量的实际类型,变量的实际类型将会由编译器自己推断。
auto a=5;//a为整型
auto b=0.5;//b为浮点型
使用auto在同一条语句中声名多个变量时,每个变量的类型必须相同。
auto i=0,*p=&i;//正确,i和p都是整型
auto i=0;b=0.5;//错误,i和b的类型不同,不能在同一条语句中
符合类型、常量和auto
当auto和引用相结合使用的时候,将会把引用的对象的类型认为是变量的类型。
int i=0,&r=i;
auto a=r;
上述的变量a的类型为int。
当变量和const结合使用时,auto一般会忽略顶层const,将底层const作为其类型。
int i=0;
const int ci=i,&cr=ci;
auto b=ci;//b是一个整型,顶层const属性将会被忽略的
auto c=cr;//c是一个整型
auto d=&i;//d是一个整型指针。
auto e=&ci;//e是一个指向常量的指针,因为ci本身为常量。
2.decltype
decltype可以分析变量、表达式、或者函数的返回值的类型,它仅仅分析变量的数据类型但是并不会真正的计算出表达式。
int ci=0,&cj=ci;
decltype(ci) x=0;//x的类型是const int
decltype(ci) y=x;//y是const int &,y是绑定到x的引用
decltype(cj) z; //错误,z是一个引用,必须初始化
---------------------------------------------------
int i=3,*p=&i,&r=i;
decltype(r+0) b;//正确,r+0的值为具体的int的值,所以b是未初始化的int变量
decltype(i)e;//正确:e是未初始化的int
decltype(*p) c;//错误,解引用c的类型为int &,必须初始化;
decltype((i)) a;//错误,a的类型为引用
decltype((var))(两层括号)的值永远是引用,decltype(var)(单层引用)仅当var为引用时推断出来的才是引用。
- 对于引用而言auto推断出引用的类型,而decltype本身就是引用
- 对解引用操作,auto推断出原有类型,decltype推断出引用