auto类型常规推断
在c++11时代,auto用于变量的自动类型推断:在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,而不需要我们显示指定类型。
auto有以下特点:
1. auto自动类型推断发生在编译期,所以不会影响程序执行期间的性能
2.auto定义的变量必须立即初始化,这样编译器才能推断它的实际类型,那么编译的时候才能确定auto的类型和整个变量的类型,然后在编译期间就可以用真正的类型替换掉auto这个类型占位符
3.auto的使用灵活,和指针,和引用,和const等限定符结合使用。
注意,auto类型推断,和函数模板推断非常类似。
auto类型推断为传值方式(非指针,非引用),即auto后面直接接变量名
auto x = 10; // x类型为int auto 类型也为int
const auto x2 = x; //x2类型为const int,auto类型为int
注意,在传值方式下,引用类型会被抛弃,const属性也会被抛弃。
auto x = 27;
const auto & xy=x; //xy类型为const int&, auto类型为int
auto xy2 = xy; //xy2类型为int , auto类型为int
auto* xp2=&x; //xp2为int*,auto类型为int
auto xp3 = &x; //xp3为int*,虽然auto后面没有*,但auto也把它推导成了指针类型
注意,在指针或者引用类型(auto*,auto&)但不是万能引用下,不会抛弃const等限定符,但是会丢弃引用。
当变量类型为万能引用时(auto&&),和模板参数T类型规则相同
auto类型针对数组和函数的推断
const char mystr[]="I Love China!";
auto myarr = mystr; //此时,myarr的类型为const char *
auto& myarr2 = mystr; //const char(&)[14]
int a[2]={1,3};
auto aua = a; //aua类型为int*
void myfunc(double,int){}
auto pf = myfunc; //此时pf的类型就是void(*)(double,int)类型
auto & tmpf = myfunc; //此时tmpf的类型就是void (&)(double,int)即函数引用
auto类型针initializer_list的推断
auto it={1,3,5}; //auto会把it推导为initializer_list<int>类型
auto it{1}; //auto会把it推导为int类型
注意,auto it={1,3,5}这是一个针对auto的特殊推导,能推导出std::initializer_list类型。这种推导只适合auto,不适合模板类型。这一点是auto类型推导和模板类型推导的区别之处。其他方面,auto和模板类型推导差不多
auto不适用场合举例
(1)auto不能用于函数参数,比如void func(auto arg1,int y)是不被允许的
(2)普通成员变量类型不能是auto类型,static const静态成员可以使用auto,使用auto后,其值必须在类内初始化,注意static const和普通静态成员不一样,普通静态成员在头文件声明,然后在.cpp中定义和初始化,static const静态成员就在类里定义和初始化了