深度探索c++对象模型之template中的名称决议方式

2023-11-12

      我们应该能够区分以下两种意义:一个是c++ standard标准中的“scope of the template definition”【模板定义域】,另一个是c++ standard标准中的“scope of the template instantiation”【模板具现域】。第一种情况举例说明:
// scope of the template definition【模板定义域】

extern double foo(double);

template<class type>
class ScopeRules
{
public:
  void invariant() {  _member = foo( _val ); }
type type_dependent() { return foo( _member ); }

private:
  int _val;
  type _member;
}

      然后第二种情况也举例说明:

// scope of the template instantiation【模板具现域】

extern int foo(int);

ScopeRules<int> sr;


      在ScopeRules template中有两个foo版本:在“scope of the template definition”中,只有一个foo函数声明位于scope之内。然而在“scope of the instantiation”中,两个foo函数版本都位于scope之内。这时如果我们有一个这样的调用操作:

// scope of the template instantiation

sr.invariant();

那么在invariant中的【_member = foo( _val );】,究竟会调用哪一个函数实体呢?是scope of the template declaration【模板声明域】中的“extern double foo( double )”,还是scope of the template instantiation【模板具现域】中的“extern int foo( int )”?如果您因为在我们例子中用int具现的ScopeRules而选择了后者,那么很可惜您选错了,因为正确答案是意料之外的double foo。。。

      至于原因,让我们来看一下书中的解释:在template之中,对于一个非成员名字【如本例中invariant里面foo】的决议结果,是根据这个名字的使用是否与“用来具现该模板的实际参数类型”有关与否来决定的,如果非成员名字的使用和具现模板用的实际参数没有关联,那么就以“scope of the template declaration【模板声明域】”来决定名字归属;然而如果它们有关联,那么就以“scope of the template instantiation【模板具现域】”来决定名字归属;回头看我们上面的例子可以发现,invariant中的foo与我们用来具现模板的参数int没有关联,所以使用“scope of the template declaration”中的double版本foo函数,下面是更详细的解释:

// the  resolution fo foo() is not dependent on the template argument【foo函数的决议结果并不依赖于模板参数】
_member = foo( _val );
_val在我们的模板声明中,已经被定义成一个int类型,也就是说,_val是一个类型不会变的模板类成员,无论具现这个ScopeRules的实际参数是什么类型,都不会影响到_val本身。还有,函数的决议结果只和函数的signature【原型】有关,和函数的返回值类型什么的无关,所以,模板具现后的_member类型并不会影响到哪一个foo函数体被选中,总之就是foo的调用与具现ScopeRules的参数毫无关联!所以调用操作必须根据“scope of the template declaration”来决议,而在“scope of the template declaration”域中,只有一个double版本foo函数,所以自然只有一个候选者。【此外要注意的是,这种行为不能以一个简单的宏扩展——比如使用一个#define宏——重现之】。

      下面让我们来看看“与具现模板类型”【type-dependent】有关的用法:

sr.type_dependent();
这个函数的内容如下:

return foo(_member);
这个例子与上一个例子不同,因为_member肯定与具现ScopeRules的参数有关:该参数将决定_member的实际类型。所以这一次foo必须在“scope of the template instantiation”域中被决议,到了这个域中就有了两个foo版本函数,但由于_member的被具现后的类型是int,因此这次就是int版本的foo函数出线。但是,如果ScopeRules是被unsigned int或long具现出来,那么这里的foo选择就会模糊不清。最后,如果ScopeRules是被某一个用户自己的自定义类类型具现出来,而该类没有针对int和double实现conversion运算符【转换运算符】,那么foo的调用操作会被标识错误!但不管情况如何,都是以“scope of the template instantiation”来决定,而不是“scope of the template declaration”来决定。

      这意味着编译器必须保持两个scope contexts【上下文范围】:

1):“scope of the template declaration”,用来专注于一般的template class;

2):“scope of the template instantiation”,用来专注于特定的实体;

编译器的resolution【决议】算法必须决定哪一个才是适当的scope,然后在其中搜索适当的name。





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度探索c++对象模型之template中的名称决议方式 的相关文章

  • 我是如何设计一个包办所有对企政策的城市平台

    它是容纳了一个城市所有政府对企政策的平台 它的非正式代号是 城市主站 它的定位是 只要这个平台部署在某 入口 1 和子站入口 2 恰好对应了 路径的上一层 于是我用最少的元素实现了导航的逻辑完备 一个政策能看和能办是两回事 政策任何时候都可
  • SQL 课后作业答案 练习2 练习6

    Exercise2 1 Find the name and salary of employees in Luton SELECT ename sal FROM emp e dept2020290223 d WHERE loc Luton
  • vue-admin 完全隐藏掉左侧菜单栏

    在 src styles sidebar scss文件中修改第一个 hideSidebar hideSidebar sidebar container sidebar container el menu width 36px importa
  • DBeaver改变字体

    dbeaver的sql编辑区字体小 费眼 想改变字体 在设置中没有改变字体的设置 折腾好半天 发现另一种曲线救国的方式
  • 一周Hard (2021.11.29-2021.12.05)

    862 和至少为 K 的最短子数组 先从朴素的思想去考 枚举当前的前缀和 k k k 那么我们需要找到当前位置之前的满足差大于等于 k k k的最大位置 i
  • 【翻译】什么是 "政策即守则"?

    身份很容易 毕竟 每个人都有一个 认证 可能就更不复杂了 任何使用智能手机的人每天都要认证几十次才能使用它 这甚至还没有涉及银行 工作或社交媒体所需的远程服务 也许正是这种明显的简单性吸引了我在大约五六年前进入身份系统的世界 在这之前的几年
  • python 可视化_提升你的Python可视化编程技能,一文学会图表添加参考线和区域...

    前两次呢 已经和大家讨论了关于Python数据可视化的经典库matplotlib相关的东东 已经介绍了plot scatter xlim ylim xlabel ylabel 和grid 这几个函数哦 下面呢 咱们继续前两节的内容 继续和大
  • linux————pxe网络批量装机

    目录 一 概述 什么是pxe pxe组件 二 搭建交互式pxe装机 一 配置基础环境 二 配置vsftpd 三 配置tftp 四 准备pxelinx 0文件 引导文件 内核文件 一 准备pxelinux 0 二 准备引导文件 内核文件 五
  • 让 AI 真正读懂人类语言,5分钟搞懂 word embedding 技术

    大家好啊 我是董董灿 在学习自然语言处理 NLP Natural Language Processing 时 最先遇到的一个概念 可能就是词嵌入 word embedding 了 词嵌入 是让AI真正理解人类自然语言的技术 看完本文再回过头
  • python+requests接口自动化测试

    原来的web页面功能测试转变成接口测试 之前大多都是手工进行 利用postman和jmeter进行的接口测试 后来 组内有人讲原先web自动化的测试框架移驾成接口的自动化框架 使用的是java语言 但对于一个学java 却在学python的
  • 关于文件上传

    目录 1 文件上传的原理 2 文件上传到本地服务器 2 1 添加上传的依赖 2 2 创建一个页面 2 3 在springmvc中配置文件上传解析器 2 4 创建upload01接口方法 3 elementui vue axios完成文件上传
  • SpringBoot,Controller 注解

    SpringBoot Controller 注解 RequestMapping ping PathVariable RequestMapping value id method RequestMethod GET public List
  • Python·Jupyter Notebook各种使用方法

    1 更改Jupyter notebook的工作空间 Jupyter的工作空间在哪里指定 在cmd中输入jupyter notebook generate config 如果该配置文件已经存在 那么 会出现如下信息 从中可以见到配置文件存在的
  • 交叉验证--关于最终选取模型的疑问

    看最下面对这个回答 2018 06 21 很多书上都说了交叉验证的方法 还有留出法的评估方法 西瓜书 他们也都说了多次抽样然后多次评估取平均的策略 这样是为了充分利用这个样本集的分布 这里有一个问题 那就是 既然是取平均 那这个分类器到底是
  • JAVA设计模式之Chain-of-Responsiblility模式

    当一个请求可以被多个对象处理 同时又无法确定到底有谁来处理该请求 这时 我们就需要让该请求在这些对象之间一个个的接力 如果当前对象可以处理请求则处理它 否则 传递给下一个对象处理 这就是责任链模式的思想 责任链模式的组件结构图如下 可以看出
  • Python+Selenium_UI自动化操作(8)——获取页面元素的标签+尺寸

    UI自动化 获取当前页面某元素的标签 尺寸 语法 1 标签名 tag name 2 size size 返回一个字典 包括height width class TestGetElementInfo unittest TestCase def
  • vue实现接口中得数据有变化就要实时得请求获取到最新数据

    1 使用 sockets 与服务器建立实时通信 接收数据变化推送在 created 生命周期中建立 sockets 连接 js created this socket io someUrl this socket on dataChange
  • [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

    最近做android百度地图 但是使用baidumapapi v2 3 1 jar和libBaiduMapSDK v2 3 1 so显示百度地图时总是遇到问题 只显示网格而没有显示地图 网络连接和APIKey申请都是正确的 就是不知道为什么
  • 【GRU回归预测】基于麻雀算法优化门控循环单元SSA-GRU神经网络实现多输入单输出回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像

随机推荐

  • CSS之Sass中的@mixin和@extend,使用详细(Sass中@mixin和@extend的区别)

    简介 mixin 该指令用于定义可重用的代码块 可以在需要的地方进行调用 通过 mixin指令 你可以将一组样式代码封装成一个mixin 并在需要的地方使用 include指令来调用这个mixin 这样可以避免重复编写相同的样式代码 提高代
  • 模拟退火算法 Simulated Annealing(SA)学习笔记

    1 模拟退火算法思想 所谓模拟退火就是模仿物质退火过程 物体温度高时分子运动剧烈 此时我们的算法接受新解的概率拉高 物体温度逐渐趋向平和时 此时我们算法接受新解更新的概率降低 首先物体刚开始处于非晶体状态 左图 我们将固体加温至充分高 固体
  • sync/atomic 库使用小结

    sync atomic 库提供了原子操作的支持 原子操作直接有底层CPU硬件支持 因而一般要比基于操作系统API的锁方式效率高些 本文对 sync atomic 中的基本操作进行一个简单的介绍 原子增值 用于对变量值进行原子增操作 并返回增
  • 聊天机器人和 Rasa 2.0 的新增功能

    目录 聊天机器人和 Rasa 2 0 的新增功能 文件夹和文件层次结构 配置 config yml Pipeline Policies Importers Domain domain yml Training Data Format NLU
  • 码点与代码单元

    码点与代码单元 码点 码点是指与一个编码表中的某个字符对应的代码值 在Unicode标准中 码点采用16进制书写 并加上U 例如U 0041就是拉丁字母A的码点 代码单元 UTF 16编码采用不同长度的编码表示所有Unicode码点 在基本
  • “12306”是如何支撑百万QPS的?

    12306抢票 极限并发带来的思考 每到节假日期间 一二线城市返乡 外出游玩的人们几乎都面临着一个问题 抢火车票 虽然现在大多数情况下都能订到票 但是放票瞬间即无票的场景 相信大家都深有体会 尤其是春节期间 大家不仅使用12306 还会考虑
  • Linux中的五种I/O模型

    概念说明 用户空间和内核空间 现在操作系统都是采用虚拟存储器 那么对32位操作系统而言 它的寻址空间 虚拟存储空间 为4G 2的32次方 操作系统的核心是内核 独立于普通的应用程序 可以访问受保护的内存空间 也有访问底层硬件设备的所有权限
  • OpenCV中对Mat矩阵加、减、乘、除、转置等操作的总结

    1 矩阵加 1 使用重载的 运算符 矩阵的加法是指两个矩阵对于位置的数值相加 使用OpenCv重载的 运算符 假设两个矩阵都为uchar类型 例如 Mat src1 Mat
  • 1.3 DLT645

    一 简介 目前市面的大部分的电表 通信都是遵循该协议 因为物理层使用RS 485 故为半双工通信 主站指终端设备 从站指多功能电能表 数据链路层 默认波特率2400 偶校验 8bit数据 1bit停止位 先传低位 后传高位 D0是字节最低有
  • uiautomator2学习5——一个简单的例子

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 uiautomator2学习5 一个简单的例子 写了个简单的例子 就是打开淘宝搜索钥匙扣的一个简单的代码 如下 import uiautomator2 as u2 d u2
  • Spring框架中IOC容器和Bean的配置

    一 IOC和DI的解释 1 IOC Inversion of Control 反转控制 在应用程序中的组件需要获取资源时 传统的方式是组件主动的从容器中获取所需要的资源 在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式 增加
  • Java基础——Map集合遍历方式

    1 方式一 键找值 先获取Map集合的全部键的Set集合 遍历键的Set集合 然后通过键提取对应值 涉及API 方法名称 说明 Set
  • 【导入file文件转数组】input -> type=‘file‘ -> list

    组件 admin文件 引用xlsx js import HandleImportFile from common xlsx js
  • 读书笔记_《Linux高性能服务器编程》_第 5 章:网络编程基础API

    第 5 章 Linux网络编程基础API 知识要点 socket 地址 API socket 基础 API 网络信息 API 1 socket 地址API 主机字节序和网络字节序 CPU 32位 的累加器一次至少可以装载 4 字节 即一个整
  • C# 常用复习

    Char类型 char a a char b 8 char c L char d char e l char f IsLetter 判断是否是字母 Console WriteLine 判断a是否是字母 Char IsLetter a IsD
  • getaddrinfo简单应用——取得IP地址

    转自 http biancheng dnbcw info linux 265956 html 一个域名可能对应好几个ip地址 a out www baidu com 115 239 210 27 115 239 211 112 getadd
  • 深度学习: Epoch、batchsize、iterations 是什么?

    Epoch 英文 时代 阶段 一波 一轮 一个epoch 表示 所有的数据送入网络中 完成了一次前向计算 反向传播的过程 由于一个epoch 常常太大 分成 几个小的 baches 将所有数据迭代训练一次是不够的 需要反复多次才能拟合 收敛
  • String数组中扩容与填加元素

    String deepCode1 350000 350100 350102 String split deepCode1 split System out println String数组原来的长度为 split length 追加扩容 w
  • vue高德地图的实现 根据经纬度回显地理位

    效果图 1 首先 下载vue amap 插件 2 在main js中引入 import VueAMap from vue amap Vue use VueAMap VueAMap initAMapApiLoader key 你自己的key
  • 深度探索c++对象模型之template中的名称决议方式

    我们应该能够区分以下两种意义 一个是c standard标准中的 scope of the template definition 模板定义域 另一个是c standard标准中的 scope of the template instant