C++11中引入了auto&decltype关键字实现类型推导,通过这两个字可以方便的获取复杂的类型还可以简化代码,提高编码效率。
auto关键字
auto类型推导
C++98/03中一直就有auto关键字了,只不过在C++98/03中auto关键字用于标识具有自动存储期的局部变量,它的作用并不大,在实际的编码过程中我们基本没有用过auto关键字,比如
auto int i = 0; //在C++98/03中 它的定义和int i = 0;是一样一样的,因此通常为了方便我们都省略了auto关键字,与之相对应的是
static int i = 0; //标识i是一个静态类型,存储在堆的全局数据区。
在C++11中auto关键字被重新利用了,用作类型推导,比如通常我们定义一个变量:
int i = 0; //强类型定义 改用auto关键字的话就可以 auto i= 20;这样定义了,我们就不需要关系对于每个值定义成什么类型,编译器自动会去根据初始化表达式的值的类型去推导变量的具体类型,因此也就意味着,编译器要推导出变量的类型,那么该变量就必须初始化,否则会编译失败。
看下面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 *类型
static auto y = 0.0; //OK:y是double类型
auto int r; //error 无法通过编译
auto s; //error 无法通过编译
使用VC2013 IDE在main返回之前打个断点,可以再VC的local窗口看到变量的类型,如下:
因此,由上可知,auto不能代表一个实际的类型声明,如s编译错误,仅仅是用作类型声明的一个占位符,在编译期间,编译器会根据后面初始化值的具体类型替换auto占位符。
auto的推导规则
下面通过一组例子我们来看一下编译器在编译器间是如何推导出变量的具体类型的。
int x = 0;
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 -> int auto 被推导为int
auto f = e; //f -> int auto被推导为int
const auto & g = x; //g ->const int &
auto &h = g; //h -> const int &
上面的例子可以看出。a,c的推导结果比较见到,b说明b不声明为指针也可以推导出b为指针类型,需要注意的是:
1、d的推导结果说明当表达式是一个引用类型的时候,auto会把引用类型抛弃,直接推导成原始类型int.
2、f的推导结果说明,当表达式是一个带cv限定符时,auto会把cv限定符也就是const抛弃,推导成non-cons