Item6 Use the explicitly typed initializer idiom when auto deduces undesied t...

[复制链接]

该用户从未签到

759

主题

763

帖子

4660

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4660
跳转到指定楼层
楼主
发表于 2018-6-4 15:12:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Item5中提到了使用auto所带来的诸多优点,在Item2中提到了auto的类型推导规则和模板类型推导基本一致,推导出来的类型有的时候并不是我们所想要的类型(会忽略CV限制符和引用),那么本文继续探究auto的其它缺点。
  1. std::vector<bool> features();
  2. auto ret = features();
复制代码
上面的ret是bool类型吗? 表面看起来是没什么问题的,其实不然,vector<bool>的operator[]的返回值其实并不是bool类型,vector<bool>比较特殊,它返回的是vector<bool>::reference,为什么要这样呢?返回一个bool引用类型不就完了嘛,标准库干嘛非要这么大费周章的搞了个这样的类型呢?,原因有以下几个:
  • 因为bool占用一个字节,标准库为了节省内存,改用bit来表示
  • 因为operator[]需要返回一个内部元素的引用,但是没办法对一个bit进行引用
  • 为了让返回的类型统一,无论是bool类型,还是其它类型
   为此标准库为了实现上述三个目标就封装了一个内部的类型vector<bool>::reference,是一个proxy类,具体参见cppreference因此auto在这里老老实实得到了一个vector<bool>::reference类型,而如果使用下面的代码:
  1. bool ret = features();
复制代码
features返回的vector<bool>::reference类型会隐式转换为bool类型。在这个场景下使用auto会弄巧成拙,幸好我们可以通过使用static_cast`强制进行类型转换得到我们想要的类型。
  1. auto ret = static_cast<bool>(features);
复制代码



分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表