类的代理对象

其实这部分内容主要是说明了在STL或者某些其他代码的容器中,在一些代理类的作用下使得最后的返回值并不是想要的结果。

而他的返回值则是类中的一个容器,看下面的一段代码:

      std::vector<bool> Boolen(const Sign& w);//返回值为vector<bool>的函数
Signed a;
bool b = Boolen(a)[3];//返回值为 vector<bool>&
auto c = Boolen(a)[3];//返回值为vector<bool>::reference

对于上面一段代码来说,auto返回值并不是我们想要类型。这是因为在STL的vector< bool >的代码中,为了压缩性的表示持有的bool的元素,在其中设置了一个代理类。每个bool元素是用一个比特来表示。

如果你想要较真的问是这个代理类是如何工作的。可以简要介绍一下流程,对于bool b = Boolen(a)[3];来说,首先Boolen返回了一个vector< bool >类型的对象,然后针对这个指针执行operator[],

返回了一个vecort< bool >::reference的对象,紧接着该对象执行了一个隐式类型转换,转换成了需要的bool类型。

有这种代理类的还有bitset类和智能指针。而且同属于代理类的,还有一些c++库中的类,他们采取了表达式模板的技术。这种技术主要是提高数值计算代码的效,比如:

Myclass sum = m1 + m2 + m3 + m4;

其中对于operator+返回的并不是对应的Myclass类,而是对应的代理类,最后再通过隐式的类型转换从代理类变成Myclass;

所以这个条款主要说是,auto和代理类并不能相容,所以在这种情况下(一般通过代码文档和头文件知道代理类的存在),我们需要显示的类型转换:auto c = static_cast< bool >Boolen(a)[3];

最新文章

  1. JS 与OC 交互篇
  2. 关于Java运算中类型自动提升的问题
  3. RabbitMQ原理
  4. Python3基础 random 产生置顶区间的随机整数
  5. [需再总结]SSH整合代码生成器
  6. 【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式
  7. LightOJ 1135(线段树)
  8. UNIX网络编程---TCP客户/服务器程序示例(五)
  9. uva 719 Glass Beads(后缀自动机)
  10. java连接mysql源码
  11. 转载-Python单元测试框架——unittest
  12. MySql:SELECT 语句(四)通配符的使用
  13. 如何控制iOS的导航栏和状态栏的样式
  14. python从sqlite中提取数据到excel
  15. VS快捷键以及Reshaper快捷键
  16. Oracle零碎总结:结构-工具-创建语句
  17. 关于结构体占用空间大小总结(#pragma pack的使用)
  18. 【BZOJ】2705: [SDOI2012]Longge的问题
  19. 真正明白c语言二级指针
  20. linux 解决 gvfsd-smb-browse CPU 100%占用

热门文章

  1. centos7 samba安装教程
  2. python反序列化学习记录
  3. MySQL5.7版本sql_mode=only_full_group_by问题解决办法
  4. 【状态压缩DP】SCOI2009 围豆豆
  5. Linux关联文件扩展名和打开程序
  6. property和setter装饰器
  7. Linux安装软件时90%的人会遇到这个报错,如何解决?
  8. IDEA 半天卡住buid(编译)不动
  9. 学习python须知,Python基础进阶需掌握哪些知识点?
  10. CTF-pwn:老板,来几道简单pwn