日常学习记录2:auto和decltype

1.auto关键字

用于自动推断类型,根据等号右边变量的类型字面值

e.g.1:

int i1 = 1;double d1 = 2.1;

auto i2 = i1;//i2是int型

auto i3 = 5;//i3是int型

auto d2 = d1;//d2是double型

e.g.2:

一句auto可以声明并初始化多个变量,但是等号右边变量必须是同一基本类型 

int i1 = 1, i2 = 2;

double d = 1.1;

auto a = i1, b = i2;//合法,二者等号右边类型一致且均为int

auto a = i1, b = d;//不合法,i1和d的类型不相同

auto a = i1, i2 = 2, *p = &i2;//合法,i1、i2为整数,p为整形指针

完全当做int、double等基本类型的等价写法,推断出来的不包括*、&,并保留底层const忽略顶层const。

注意:auto *p = &a 等价 auto p = &a,因为&a得到的是a的地址,地址的类型就是指针。

 

2.decltype关键字

与auto类似,也用于推断类型,但用法不同

e.g.1:

可以推断函数的返回值作为类型,但是并不会调用函数

int f()

{

//.......

}

int i = 1;

decltype(f()) a = i;//f()的返回值为int,所以a是int型

e.g.2:

与auto不同的是,decltype推断出的包括*、&、const

const int ic = 0, jc = 2, &ir = ic;

decltype(ic) ic2 = 1;//ic2是 const int

decltype(ir) ir2 = jc;//jc是const int &

decltype(ir) ir3;//错误,引用必须初始化

e.g.3:

在对引用、指针有关进行推断时候,返回的可能不是引用

int i = 0, &ir = i, *p = i;

decltype(ir + 0) a = i;//因为ir + 0 返回的是一个int值,所以a是int型

decltype(*p) b;//不合法,如果decltype(p) b则b是一个指针,而此处为decltype(*p) b,对指针p的提领的结果进行推断,指针p的提领结果为引用,所以b为引用

e.g.4:

如果给要推断的内容加上括号,则成为一个表达式,变量是可作为赋值语句左值的特殊表达式,加上括号后推断得到引用类型

int i = 0;

decltype(i) a;//正确,a为int型

decltype((i)) b;//错误,b为int&,必须初始化

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页