<Effective Mordern C++>Item 6:UseTheExplicitlyTypedInitializerIdiomWhenAutoDeducesUndesiredTypes

本文探讨了C++中使用auto关键字与std::vector&lt;bool&gt;结合时的特殊情况及潜在问题,包括vector&lt;bool&gt;::reference类型、隐式类型转换以及如何正确获取bool类型的值。

啊…别人总结的精简干练,那么…再怒转一篇???
原博

在Item5中提到了使用auto所带来的诸多优点,在Item2中提到了auto的类型推导规则和模板类型推导基本一致,推导出来的类型有的时候并不是我们所想要的类型(会忽略CV限制符和引用),那么本文继续探究auto的其它缺点。

std::vector<bool> features();
auto ret = features();

上面的ret是bool类型吗? 表面看起来是没什么问题的,其实不然,vector<bool>operator[]的返回值其实并不是bool类型,vector<bool>比较特殊,它返回的是vector<bool>::reference,返回一个bool引用类型不就完了嘛,标准库干嘛非要这么大费周章的搞了个这样的类型呢?,原因有以下几个:

  • 因为bool占用一个字节,标准库为了节省内存,改用bit来表示
  • 因为operator[]需要返回一个内部元素的引用,但是没办法对一个bit进行引用
  • 为了让返回的类型统一,无论是bool类型,还是其它类型

为此标准库为了实现上述三个目标就封装了一个内部的类型vector<bool>::reference,因此auto在这里老老实实得到了一个vector<bool>::reference类型,而如果使用下面的代码:

bool ret = features();

features返回的vector<bool>::reference类型会隐式转换为bool类型。

在这个场景下auto弄巧成拙,幸好我们可以通过使用static_cast强制进行类型转换得到我们想要的类型。(static_cast可以用来去引用)

auto ret = static_cast<bool>(features);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值