类的代理对象

其实这部分内容主要是说明了在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];

Effective Modern C++ ——条款6 当auto型别不符合要求时,使用带显式型别的初始化物习惯用法的更多相关文章

  1. Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义

    条款6:当auto推导出意外的类型时,使用显式的类型初始化语义 条款5解释了使用auto来声明变量比使用精确的类型声明多了了很多的技术优势,但有的时候,当你想要zag的时候,auto可能会推导出了zi ...

  2. Effective Modern C++ 条款2:理解auto型别推导

    在条款1中,我们已经了解了有关模板型别的推导的一切必要知识,那么也就意味着基本上了解了auto型别推导的一切必要知识. 因为,除了一个奇妙的例外情况,auto型别推导就是模板型别推导.尽管和模板型别推 ...

  3. Effective Modern C++ ——条款5 优先选择auto,而非显式型别声明

    条款5 对于auto ,他的好处不仅仅是少打一些字这么简单. 首先在声明的时候, 使用auto会让我们养成初始化的习惯: auto x;//编译不通过必须初始化. 再次对于auto而言,它可以让我们定 ...

  4. Effective Modern C++ 条款3:理解decltype

    说起decltype,这是个古灵精怪的东西.对于给定的名字或表达式,decltype能告诉你该名字或表达式的型别.一般来说,它告诉你的结果和你预测的是一样的.不过,偶尔它也会给出某个结果,让你抓耳挠腮 ...

  5. [Effective Modern C++] Item 5. Prefer auto to explicit type declarations - 相对显式类型声明,更倾向使用auto

    条款5 相对显式类型声明,更倾向使用auto 基础知识 auto能大大方便变量的定义,可以表示仅由编译器知道的类型. template<typename It> void dwim(It ...

  6. [Effective Modern C++] Item 2. Understand auto type deduction - 了解auto类型推断

    条款二 了解auto类型推断 基础知识 除了一处例外,auto的类型推断与template一样.存在一个直接的从template类型推断到auto类型推断的映射 三类情况下的推断如下所示: // ca ...

  7. item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 5解释了比起显式指定类型,使用auto来 ...

  8. Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype

    条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声 ...

  9. Effective Modern C++ 条款4:掌握查看型别推导结果的方法

    采用何种工具来查看型别推导结果,取决于你在软件开发过程的哪个阶段需要该信息.主要研究三个可能的阶段:撰写代码阶段.编译阶段.运行时阶段. IDE编译器 IDE中的代码编译器通常会在你将鼠标指针选停止某 ...

随机推荐

  1. devops-jenkins部署和基本使用

    1. jenkins部署和基本使用  1.1) 先关闭centos 7的自带防火墙和selinux [root@test-2 ~]# /bin/systemctl stop firewalld [ro ...

  2. bash 在指定目录查找包含特定关键字的文件

    比如我们要在目录/usr/local/nginx/conf/vhost/下查找baidu.com这个关键字的文件 方法1: find /usr/local/nginx/conf/vhost/ -exe ...

  3. Python初学习:简单的练习题

    Python初学习 一些见到那的练习题: 初级难度 设计一重量转换器,输入以g为单位的数字后,返回换算结果以Kg为单位的结果 中级难度 设计一个求直角三角形斜边长的函数,(以两个直角边为参数,求最长边 ...

  4. 【8】进大厂必须掌握的面试题-Java面试-异常和线程

    Q1.错误和异常有什么区别? 错误是在运行时发生的不可恢复的情况.如OutOfMemory错误.这些JVM错误无法在运行时修复.尽管可以在catch块中捕获错误,但是应用程序的执行将停止并且无法恢复. ...

  5. 再过两年C语言就50岁了,这么老的编程语言怎么还没有过时?

    再过两年,C语言将迎来它的 50 岁生日,同样进行周年庆的还有 PL/M和Prolog.不过,C语言至今仍然非常受欢迎,它在几乎所有编程语言中的受欢迎程度,始终排在前十名.   大多数操作系统的内核( ...

  6. 【C++学习笔记】C++经典十二道笔试题!你能做出几道?

    1. 运行下面的C++代码,得到的结果是什么? #include "stdafx.h" #include<iostream> using namespace std; ...

  7. hugo不蒜子统计数量

    date: "2020-10-18T22:39:27+08:00" title: "hugo不蒜子统计数量" tags: ["不蒜子"] c ...

  8. hasmap hashtable

    hashMap和hashtable方面的知识点吧: 1. 关于HashMap的一些说法: a) HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体.HashMa ...

  9. 使用WxPusher给自己的个人微信发送提醒消息(WxPusher微信推送服务)

    1.背景 我们很多时候,我们在服务器上运行软件,发生一些业务异常,需要给我们发送一个及时的提醒,或者是使用一些耗时软件,比如抢车票,抢课,刷优惠券当任务运行成功以后,也需要及时的发送消息给自己 ,告诉 ...

  10. ubuntu 使用cuda以及cudnn

    关于我自己的电脑是 mx250显卡. 使用cuda之前需要解决显卡驱动的问题,这个问题最简单的办法就是在[软件更新器]里面更换下载源.我的语言设置是中文,所以默认是cn的镜像源.更换成ustc(中国科 ...