Effective Modern C++ ——条款6 当auto型别不符合要求时,使用带显式型别的初始化物习惯用法
2024-10-18 20:19:36
类的代理对象
其实这部分内容主要是说明了在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];
最新文章
- JS 与OC 交互篇
- 关于Java运算中类型自动提升的问题
- RabbitMQ原理
- Python3基础 random 产生置顶区间的随机整数
- [需再总结]SSH整合代码生成器
- 【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式
- LightOJ 1135(线段树)
- UNIX网络编程---TCP客户/服务器程序示例(五)
- uva 719 Glass Beads(后缀自动机)
- java连接mysql源码
- 转载-Python单元测试框架——unittest
- MySql:SELECT 语句(四)通配符的使用
- 如何控制iOS的导航栏和状态栏的样式
- python从sqlite中提取数据到excel
- VS快捷键以及Reshaper快捷键
- Oracle零碎总结:结构-工具-创建语句
- 关于结构体占用空间大小总结(#pragma pack的使用)
- 【BZOJ】2705: [SDOI2012]Longge的问题
- 真正明白c语言二级指针
- linux 解决 gvfsd-smb-browse CPU 100%占用