auto和decltype称为占位符,在编译时进行自动类型推断。
auto使用的几点注意
- auto从给定初值中进行类型推断,使用auto的表达式同时完成定义和初始化;
- auto支持一行语句定义多个变量,但需要类型相同。注意&和*非基本数据类型;
1
2
3
4
5
6
7
8
9int a;
auto b=a, &c=a; // 正确 auto类型推断为int
auto d=&a; // 正确,auto推断类型为int*
auto *d1=&a; // 正确,auto推断类型也是int*,auto推断可以看出很灵活
auto b=a, &c=a, d=&a; // 错误 前两个auto推断为int,后面为int*
auto b=a, &c=a, *d=&a;// 正确 auto全部推断为int
const int m=0;
auto x=a, y=m, *z=&m; // x,y均int,但&z是const int类型,error - 使用引用时参与初始化的是引用对象的值,而非引用对象本身;
1
2const int &a=0;
auto b=a; // b类型int而非const int & - auto一般会忽略顶层const,保留底层const。如果希望保留顶层const,需要自行在auto前添加const;
1
2
3const int &a=0;
auto b=a; // b int
const auto c=a; // c是const int a,const属性自己添加。 - 设置类型为auto引用或auto指针时,初始值中的顶层const属性得到保留。因为对const取引用或者取地址一定是底层const。 关于auto以下几条肯定成立:
1
2const int a=0;
auto &b=a, *c=&a; // b为const int &, c为const int *
- 不能用作函数参数。auto需要编译时确定类型,但是函数编译时不能进行形式结合,无法判定类型;
- auto不能用作类的非静态成员,只有类的静态成员才具有初值(要么默认的0,要么类外初始化),类的普通成员编译时不能得到具体参数;
decltype使用的几点注意
- decltype使用表达式的类型进行推断,并不实际计算表达式(也不调用函数);
- 如果decltype使用的是变量,返回变量的类型,包含引用和顶层const;
- 如果decltype使用的表达式不是变量,返回表达式的结果对应类型;
1
2
3
4int a=0;
int &b=a;
decltype(b) c; // 类型int&
decltype(b+1) d; //类型int - decltype内部如果使用括号结果一定是引用。