第一章 使用C++11让程序更简洁、更现代
1.1 类型推导
1.1.1 auto类型推导
1、auto关键字的新意义
不同于python等动态类型语言的运行时进行变量类型的推导,隐式类型定义的类型推导发生在编译期。它的作用是让编译器自动推导出这个变量的类型,而不需要显示指定类型。
下面是auto的一些基本用法:
auto x = ; //ok:x是int类型
auto pi = new auto(); //ok:pi被推导为int*
const auto *v = &x, u = ; //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的类型
上面的代码中:字面量5是一个const int类型,变量x将被推导为int类型(const被丢弃,后面做说明),并被初始化为5;pi的推导说明auto还可以被用于new操作符;对于v和u的推导需要注意两点(1)虽然经过前面的const auto *v = &x的推导,auto的类型可以确定为int了,但是u仍然必须要写后面的“= 6”,否则编译将报错。(2)u的初始化不能编译器推导产生二义性。例如,把u的初始化改为“u = 6.0”,编译器将被会报错。
使用auto声明的变量必须马上初始化(或者已经初始化完了,如上面的引用),以让编译器推导出它的实际类型,并在编译时将auto占位符替换为真正的类型。
2、auto的推导规则
auto可以结合指针、引用一起来使用,还可以带上cv限定符(cv-qualifier、const和volatile限定符的统称)。下面再看一些例子: