类型推导

C++ 11 中引用了 auto关键字来实现类型推导,通过使用auto 关键字不仅能方便获取复杂类型,还能简化书写,提高代码效率

1.1 auto 类型推导

在C#中隐式声明和显式声明
var i = 10; //隐式声明
int i = 10; //显示声明

在C#中,隐式类型定义也是强类型定义,前一行隐式类型的写法和后面显式类型的写法是等价的。
不同于python等动态语言在运行时变量类型推导,隐式类型定义的类型推导是在编译期确定的。C++11引如auto关键字来实现隐式类型定义。

auto i = 10;//i 被定义成int 类型

auto 的一些基本用法

auto x=5;// x是int 类型
auto pi = new auto(1);//pi 被推导成int*
const auto *v = &x,u = 6;//v 是const int*类型,u是int 类型
static auto y = 0.0;//y是double类型

v和u的推导要注意两点:
– 虽然前面经过const auto *v = &x的推导,auto的类型可以确定为int,但是u仍然后面必须写=6,否则编译器不给通过。
– u的初始化不能使编译推导产生二义性,比如把u 初始化成6.0;
从上面看出 auto 只是声明一个类型的占位符,使用auto 声明的变量必须马上初始化,让编译器推导出他的类型,在编译的时候将auto 占位符换成真正的类型。

1.2 auto的推导规则

auto 可以同指针和引用结合起来使用,还可以使用const和volatile限定符

int x = 10;
auto *a = &x;//a ->int*,auto = int
auto  b = &x;//b ->int*,auto = int*
auto  &c = x;//c->int&, auto = int
const auto e = x; //e->const int
auto f = e; //f ->int;
const auto &g = x;//g-> const int &
auto &h = g;//h-> const int &

注意:
– f的推导类型说明,当表达式带有const属性的时候,auto会把const 属性抛弃掉,推导成为non-const 类型
– g和h的推导说明,当auto和引用和指针结合的时候,auto 将会保留const 属性

1.3 auto的限制

  • auto 不能用于函数参数 比如void func(auto a = 1) 错误
  • auto 不能用于非静态成员变量。
struct
{
auto var = 0;//错误,auto 不能用于非静态成员变量
static const auto var1=1;//正确
}
  • auto 无法定义数组
int arry[10] = 0;
auto aa = arry;//aa->int *
auto rr[10] = arry;//错误
  • auto 无法推导出模板参数
template <typename T>
struct Bar{};
Bar<int> bar;
bar<auto> bb = bar;//错误

1.4 使用auto

  • 在遍历stl容器的时候
int main()
{
std::map<double,double> resultMap;
for(auto it = resulMap.begin();it != resultMap.end();++it)
{
}
return 0;
}

发表评论

电子邮件地址不会被公开。