C++11 的类型推导详解
auto & decltype
关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decltype关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。
auto
auto可以让编译器在编译器就推导出变量的类型,话不多说上代码:
这就是auto的基本用法,可以通过=右边的类型推导出变量的类型。
auto推导规则
直接看代码
代码1:
代码2:
总结一下auto的限制:
auto的使用必须马上初始化,否则无法推导出类型
auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败
auto不能用作函数参数
在类中auto不能用作非静态成员变量
auto不能定义数组,可以定义指针
auto无法推导出模板参数
再看这段代码:
首先介绍下cv是指const 和volatile
在不声明为引用或指针时,auto会忽略等号右边的引用类型和cv限定
在声明为引用或者指针时,auto会保留等号右边的引用和cv属性
什么时候使用auto
这里没有绝对答案,只能说一下我自己的理解,个人认为在不影响代码代码可读性的前提下尽可能使用auto是蛮好的,复杂类型就使用auto,int、double这种就没有必要使用auto了吧,看下面这段代码:
decltype
上面介绍auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,上代码:
注意:decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属性
decltype推导规则
对于decltype(exp)有
exp是表达式,decltype(exp)和exp类型相同
exp是函数调用,decltype(exp)和函数返回值类型相同
其它情况,若exp是左值,decltype(exp)是exp类型的左值引用
关于左值和右值知识点后续程序喵会介绍的,请关注哦~
auto和decltype的配合使用
auto和decltype一般配合使用在推导函数返回值的类型问题上。
下面这段代码
上面代码由于t和u类型不确定,那如何推导出返回值类型呢,我们可能会想到这种
这段代码在C++11上是编译不过的,因为在decltype(t +u)推导时,t和u尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:
返回值后置类型语法就是为了解决函数返回制类型依赖于参数但却难以确定返回值类型的问题。
关于C++11类型推导问题你看懂了吗?下去多多实践吧,记得关注程序喵哦~
更多文章,请关注我的V X 公 主 号:程序喵大人,欢迎交流。
版权声明: 本文为 InfoQ 作者【程序喵大人】的原创文章。
原文链接:【http://xie.infoq.cn/article/6d9773c6564422ff6bf837666】。文章转载请联系作者。
评论