C++ 11的类型推导 auto

在声明变量时使用auto代替类型,C++编译器就会自动推导出变量的类型

auto sum = 1 + 1;

sum被推导为int,使用auto声明的变量必须要被初始化

联合声明中的类型推导
auto a = 1,b = 2;//正确,a和b都被推导为int
auto c = 3,*pa = &a;//正确,c和pa都有基本数据类型int
auto d = 4,e = 1.2;//错误,联合声明中类型必须相同

联合声明中类型必须相同,Swift笑而不语

auto和复合类型
auto i = 0, &ri = i;
auto a = ri;

a初始化的是r引用的变量值,所以a被推导为int

auto i = 0, *pi = &i;
auto a = pi;

a初始化的是一个指针,所以a被推导为一个int *

auto和常量
int i = 0;
const int ci = i, &cr = ci;
auto b = ci;//b是int
auto c = cr;//c是int
auto d = &i;//d是int *
auto e = &cr;//e是const int *

因为使用引用就是使用引用的值,所以不会被推导为引用类型。ci的类型是const int,由于使用的是ci的值得类型,所以b,c会被推导为int
因为ciconst,所以指向ci的指针必须是只读指针(const int *),所以e被推导为const int *

如果需要bconst int,则需要显示声明

const auto b = ci;//b是const int

如果想要推导为引用类型,则需要:

auto &g = ci;//g是const int的引用
auto &h = 42;//错误,非常量引用不可以绑定字面值
const auto &j = 42;//正确,常量引用可以绑定字面值,j就是42的另一个名字

由于ciconst,所以指针e和引用g都会被推导为顶层const

注意:
联合声明中的类型必须一致,const属于基本数据类型的一部分,所以const也需要一致,而*&则从属于声明符,不参与。

auto k = ci, &l = i;//正确,k和l基本类型为int
auto &m = ci,*p = &ci;//正确,m和p都为const int
auto &n = i,*p2 = &ci;//错误,n为int 而 p2 为const int

以后涉及到新标准,就不再研究了

    原文作者:dongwenbo
    原文地址: https://www.jianshu.com/p/26ba08b00731
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞