Effective Modern C++ 之 auto的使用

前面的总结中,我们对auto进行了总结。我们了解到auto的类型推导实质是模板类型推导。现在我们来讲解一下auto的使用,有人会觉得auto的使用很简单的,其实不然,auto的使用中存在很多的陷阱的。

  • 我们都知道在栈上分配的内存空间,必须进行初始化,不然会导致未定义的行为。有时候我们显示的声明对象的型别,可能会忘记初始化,因此便会出现未定义的行为。有什么办法呢? 有啊~~ 使用auto啊,通过使用auto声明的变量,其型别都推导自其初始化物,所以对其必须进行初始化。

  • 我们学过的可调用的表达式包括:函数,函数指针,lambda表达式,bind,函数对象类(重载了operator()的类,因此该类的对象可以像函数一样使用)。c++中的std::funition可以指涉到任何的可调用的表达式,当我们创建std::funition<T>时,std::funition的模板形参就是可调用表达式。c++14中lambda表达式中我们可以使用auto,而lambda表达式的动态创建时的返回类型就是闭包(后面总结会详细的进行讲解)。使用std::funition调用闭包和使用auto声明的变量来调用的闭包效率要低,而且内存占有率要高。因此有时候使用auto可以提高效率,减少内存的开支。

  • 其实还有一点就是,有时候有些对象的类型型别又长又丑,这时我们可以使用auto来很轻松的解决这个问题。

但是前面的总结中我们提到:使用auto进行型别推导式会忽略对象的常量性和易变性,还会忽略对象的引用特性。在auto的使用中还存在一个极大的陷阱。“隐形”的代理型别可以导致auto根据初始化物推导出错误的型别。但是我们可以使用强制类型转化来使用auto

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值