特点:
1、auto自动类型推断发生在编译期,所以不会影响程序执行期间的性能;
2、auto定义变量必须立即初始化,这样编译器才能推断它的实际类型。那么编译的时候才能确定auto的类型和整个变量的类型,然后在编译期间就可以用真正的类型替换掉auto这个类型占位符。
3、auto的使用灵活,和指针 和引用 和const 等限定符结合使用。
auto类型推导出来一个具体类型。auto实际上是一个类型,那么这里的auto实际上就相当于模板函数推导里边的类型模板参数T。所以auto这个东西也是类型声明的一部分。
a)传值方式(非指针,非引用):传值时引用类型会被抛弃,const属性也会被抛弃,对方看成新副本
auto x = 27;
const auto x2 = x;
b)指针或者引用类型但不是万能引用,不会抛弃const等限定符,但是会丢弃引用
const auto &xy = x; // xy = const int & , auto = int
auto xy2 = xy; //xy2 = int, auto = int 传值时引用类型会被抛弃,const属性也会被抛弃,对方看成新副本
auto &xy3 = xy; //xy3 = const int &, auto = const int ,引用被丢弃,但const属性会保留,(因为此处为 &xy3,所以auto会继承const属性)
auto y = new auto(100);
const auto *xp = &x; //xp = const int *, auto = int
auto *xp2 = &x; xp2 = int *, auto = int;
auto xp3 = &x; //xp3 = int *, auto = int *
c)万能引用类型
int x = 19;
auto&& wnyy1 = x; // x是左值, auto = int &, wnyy1 = int &
auto&& wnyy2 = x2; // x2是左值,auto = int& , wnyy2 = const int &
auto&& wnyy3 = 100; // auto = int ,wnyy3 = int &&
三:auto针对数组和函数的推断
const char mystr[] = "I love China";
auto myarr = mystr; // const char *
auto &myarr2 = mystr; // const char (&)[14] 这里变成了数组的引用,应该是此处mystr不代表字符串数组的首地址了
int a[2] = {1, 2};
auto aauto = a; // aauto = int * , auto = int *
void myfunc3
{
}
auto tmpf = myfunc3; // void (*) (double, int) 函数指针
auto &tmpf2 = myfunc3; //void (&) (double, int) 函数引用
四、std::initializer_list<int>
auto x = 10; // int
auto x2(20); // int
auto x3 = {39}; // std::initializer_list<int> 这是一个针对auto的特殊推倒
auto x4{12}; // int
auto遇到 = {} 时推倒规则就不一样了。
std::initializer_list<int> C++11引入的新类型,表示某种特定的值得数组。这种推倒指适用于auto,不适合模板类型。这一点是auto类型推倒和模板推倒的区别之处。
auto func()
{
return 12; // 也可以
}
auto还可以放在函数返回类型的位置上。
class CT{
public:
auto m_i = 12; //报错,普通成员变量不能是auto类型。
static const auto m_si = 15; //static const可以使用auto,其值必须在类内初始化
}
void func(void x, int y){
}
auto不适用场合:
1、auto不能用于函数参数
2、普通成员变量不可以是auto类型