auto 类型推导的简单例子: auto n = 10; auto f = 12.8; auto p = &n; auto url = "http://c.biancheng.net/cplus/"; 下面我们来解释一下: 第 1 行中,10 是一个整数,默认是 int 类型,所以推导出变量 n 的类型是 int。 第 2 行中,12.8 是一个小数,默认是 double 类型,所以推导出变量 f 的类型是 double。 第 3 行中,&n 的结果是一个 int* 类型的指针,所以推导出变量 f 的类型是 int*。 第 4 行中,由双引号""包围起来的字符串是 const char* 类型,所以推导出变量 url 的类型是 const char*,也即一个常量指针。
我们也可以连续定义多个变量: int n = 20; auto *p = &n, m = 99; 先看前面的第一个子表达式,&n 的类型是 int*,编译器会根据 auto *p 推导出 auto 为 int。后面的 m 变量自然也为 int 类型,所以把 99 赋值给它也是正确的。
这里我们要注意,推导的时候不能有二义性。在本例中,编译器根据第一个子表达式已经推导出 auto 为 int 类型,那么后面的 m 也只能是 int 类型,如果写作m=12.5就是错误的,因为 12.5 是double 类型,这和 int 是冲突的。
还有一个值得注意的地方是:使用 auto 类型推导的变量必须马上初始化,这个很容易理解,因为 auto 在 C++11 中只是“占位符”,并非如 int 一样的真正的类型声明。 auto 的高级用法
auto 除了可以独立使用,还可以和某些具体类型混合使用,这样 auto 表示的就是“半个”类型,而不是完整的类型。请看下面的代码: int x = 0; auto *p1 = &x; //p1 为 int *,auto 推导为 int auto p2 = &x; //p2 为 int*,auto 推导为 int* auto &r1 = x; //r1 为 int&,auto 推导为 int auto r2 = r1; //r2 为 int,auto 推导为 int 下面我们来解释一下: 第 2 行代码中,p1 为 int* 类型,也即 auto * 为 int *,所以 auto 被推导成了 int 类型。 第 3 行代码中,auto 被推导为 int* 类型,前边的例子也已经演示过了。 第 4 行代码中,r1 为 int & 类型,auto 被推导为 int 类型。 第 5 行代码是需要重点说明的,r1 本来是 int& 类型,但是 auto 却被推导为 int 类型,这表明当=右边的表达式是一个引用类型时,auto 会把引用抛弃,直接推导出它的原始类型。