C++11 中有:auto 类型推导
auto x = 5; // OK: x 是 int 类型 auto pi = new auto(1); // OK: pi 被推导为 int* const auto *v = &x, u = 6; // OK: v是const int*类型,u是const int类型 static auto y = 0.0; //OK: y是double类型 auto int r; //error: auto不再表示存储类型指示符 auto s; //error: auto无法推导出s的类型
一、auto的推导规则
从示例中可以看到auto的一些使用方法。它可以同指针、引用结合起来使用,还可以带上cv限定符(cv-qualifier,const和volatile限定符的统称)
auto * a = &x; // a -> int*,auto被推导为int auto b = &x; // b -> int*,auto被推导为int* auto & c = x; // c -> int&,auto被推导为int auto d = c; // d -> int ,auto被推导为int const auto e = x; // e -> const int auto f = e; // f -> int const auto& g = x; // e -> const int& auto& h = g;// f -> const int&
- a和c的推导结果是很显然的,auto在编译时被替换为int,因此a和c分别被推导为int*和int&
- b的推导结果说明,其实auto不声明为指针,也可以推导出指针类型
- d的推导结果说明当表达式是一个引用类型时,auto会把引用类型抛弃,直接推导成原始类型int
- e的推导结果说明,const auto会在编译时被替换为const int
- f的推导结果说明,当表达式带有cons(t实际上volatile也会得到同样的结果)属性时,auto会把const属性抛弃掉,推导成non-const类型int
- g、h的推导说明,当auto和引用(换成指针在这里也将得到同样的结果)结合时,auto的推导将保留表达式的const属性
通过上面的一系列示例,可以得到下面这两条规则:
1)当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致
2)当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性
二、auto的限制
- auto是不能用于函数参数
- auto不能用于非静态成员变量
- auto无法定义数组
- auto无法推导出模板参数
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs