c++ Templates读书笔记 9-12章
第9章模板中的名称
1. 两个概念:(1)受限名称 (2)依赖名称p115
2. 名称的分类(1)标识符Identifier (2)运算符ID Operator-function-id (3)类型转换ID Conversion-function-id (4)模板ID Template-id (5)非受限ID Unqualified-id (6)受限ID Qualified-id (7)受限名称 Qualified-Name (8)非受限名称 Unqualified-Name (9) 依赖型名称 Dependent name (10)非依赖型名称 Nondependent name . p116
3. 受限名称的查找在一个受限的作用域内,如果该作用域是一个类,查找范围可以达到它的基类。 P117
4. 非受限名称的查找会在所有外围类中逐层进行。P118
5. ADL argument-dependent lookup p118
6. 不适用ADL的情况,受限名称,调用函数用括号括起来;对于成员函数或者类型名称,普通函数能找到。P119
7. 非受限名称后面的括号里有一个或多个表达式,那么ADL会查找其实参的associated class和associated namespace;p119
8.关于associated class 和 associated namespace
1) 对于基本类型,该集合为空
2)对于指针和数组类型,该集合是他们所引用类型的associated calss 和 associated namespace
3)对于枚举类型,associated namespace指的是枚举类型所在的namespace,对于类成员,associated class指的是该类。 **包括全局namespace ?包括基类?
4)对于class类型, associated class集合包括:该class本身,他的外围类型,直接基类和间接基类。Associated namespace包括该类所在的namespace。如果该类是某个类模板的实例,还包括该类模板声明所在的class 和 namespace。
5 )对于函数类型,该集合包括函数参数和返回值的associated class 和 associated namespace。
6)对于类X的成员指针包括,该成员相关的 associated class 和 associated namespace 和X 的associated class 和 associated namespace P119
9. ADL忽视using-directive。P120 **
10.友元函数的初次声明在类中,则其声明在外围类作用域中不可见,但是通过ADL可以使它可见,使用ADL之后小心重定义。 P121
11.非受限名称后面没有紧跟模板实参,是不会被看成是模板名称的。解决办法是给他加上作用域限定符:: 。 p123
12.maximum munch扫描原则。 P125***
13.typename使用:
1)名称出现在一个模板中
2)名称是受限的。
3)名称不是用于指定基类继承的列表中,也不是位于引入的构造函数成员初始化列表中。
4)名称依赖于模板参数。(指定必须添加typename还是可省略) p126
14.如果限定符前面的名称依赖于某个模板参数,且后面紧跟的是一个template-id,那么就需要使用template 。 P128
15. 使用using-declaration引入名字空间不会涉及到上下文的问题。P129
16. 使用using-declaration引入类能力是有限的,只能引入基类中的名称,有点类似于快捷方式。P129
17. 如果使用using-declaration引入的依赖型名称是一个类型,则必须使用typename关键字,如: using typename BXT<T>::Mystery; p130
18. 关于显示模板实参和ADL,编译器会把 <>看做小于号和大于号,因为无法判断id一个template-id 。 p130
19.对于模板中的非依赖型基类,如果在他的派生类中查找一个非受限名称,它会先查找这个非依赖基类,然后再查找模板的实参列表。 P131
20.非依赖型名称会在看到时立即查找,但是不会在基类中进行查找。 P132
21.可以通过将非依赖型名称变为一个依赖型名称,来延迟该名称的查找。 this-> 或者 C<T>:: 。 p133
第11章 模板的实参演绎
1. 对于匹配类型A ,和参数化类型P:
a. 如果被声明的参数是一个引用,那么P就是所引用的类型,A仍然是实参的类型。
b. 如果被声明的类型不是一个引用,P就是所声明的类型,A仍然是实参的类型。
c. 若果这个参数类型是数组或者函数类型,还会进行decay转型,转化为指针类型;同时还会忽略高层次的const和volatile限定符。 P164 **
2. 对于引用类型,是不会进行decay转型的。例如:
Template<typename T> T const& max( T const& a, T const& b);
Max( “Apple” , “Pear” ); // T 则被同时演绎成 char[6]和char[5] , 演绎失败! P165
3. 不能作为演绎上下文的包括:
a. 受限的类型名称
b. 模板参数还有其他成分的非类型表达式 p167 ****
4. 两种特殊情况:
a. 去函数模板地址。P为函数模板声明的参数化类型。A为函数指针指定的类型。
b. 档转型运算符模板。P为转型运算符返回的类型。A为试图转型的类型。 P167
5. 可接受的实参转型
a. 如果原来声明的参数是一个引用参数,那么被替换的P类型可以比A类型多一个const或者volatile.
b. 如果A类型是指针类型或者成员指针类型,那么他可以进行限定符转型,就是添加const或Volatile,转化为被替换的P类型。
c. 当演绎过程不涉及到转型运算符石被替换的P类型可以使A类型的基类,或者指向A指向类的基类的指针。 P 168
6. 模板的实参演绎只能用户函数模板或者成员函数模板,不能应用于类模板。 P169
7. 缺省的函数模板实参不能作为实参演绎。 P170
8. 缺省的函数模板实参如果没有使用,则遵循SFINAE原则。 P170
9. Barton-Nackman方法 **
第12章 特化与重载
1. 模板的特化与函数模板的重载,类模板不支持重载,函数不支持局部特化,但是重载可以替换该功能。 P177
2. 不仅同名模板可以同时存在,他们各自的实例化体也可以同时存在,即使他们拥有一样的参数和返回值。 P179
3. 函数签名:
a. 非受限函数名称(或者产生自函数模板的这类名称)。
b. 函数名称所属的类作用域或者名字空间作用域;如果函数名称是具有内部链接的,还包括该名称声明所在的翻译单元。
c. 函数的const、volatile或者const volatile限定符(前提是它是一个具有这类限定符的成员函数. **)
d. 函数参数的类型(如果这个参数产生自函数模板,那么指的是模板参数被替换之前的类型 **)
e. 如果这个函数产生自函数模板,那么包括他的返回类型。
f. 如果这个函数式产生自模板,那么包括模板参数和模板实参。 P180
4. 正式的排序原则 p183***
5. 模板函数可以和非模板函数同时重载,但是当其他条件都一样时,实际调用优先选择非模板函数。P185
6. 以前置声明的方式全特化模板,不需要template<>; p187
7. 应确认特化的声明对所有泛型模板的用户都可见。P189
8. 全局函数模板特化不能包含缺省的实参值,然而可以直接应用这些缺省实参值。P190
9. 对于非内联的全局函数模板特化,他的定义只能出现一次。(那么全局类特化呢)**P191
10. 全局成员特化。 p192
11. 不同于普通类的成员函数和静态成员变量,针对于类模板的特化,非定义的类外声明在C++中是合法的。(目的是为了把定义放到单独的编译单元中)P193
12. 局部特化递归时,应该添加一个全特化作为终止点。P196
13. 局部特化参数列表和实参列表的一些约束:
a. 局部模板的实参必须和基本模板的相应参数是匹配的。
b. 局部特化的参数列表不能具有缺省参数;但局部特化仍然可以使用基本类模板的缺省参数。
c. 局部模板的非类型实参只能是非类型值,或者是普通的非类型模板参数,不能使依赖型表达式如:2*N 。*
d. 局部特化的模板参数列表不能和基本模板的参数列表完全相同。 P196
14. 多个匹配程度一样的局部特化会造成二义性。
对于类模板局部特化的
c++ Templates读书笔记 9-12章相关推荐
- PMP读书笔记(第12章)
大家好,我是烤鸭: 今天做一个PMP的读书笔记. 第十二章 项目采购管理 项目采购管理 项目采购管理的核心概念 项目采购管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 ...
- AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第12章:WEB SCRAPING
Web Scraping是指用程序来下载和处理网络上的内容.Scrap是铲,刮和削的意思. 本章介绍的模块包括webbrowser,requests,bs4和selenium. 项目: 使用WEBBR ...
- Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...
- Machine Learning in Action 读书笔记---第3章 决策树
Machine Learning in Action 读书笔记 第3章 决策树 文章目录 Machine Learning in Action 读书笔记 一.决策树算法简介 1 决策树的构造 2 决策 ...
- Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧
Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...
- 《Spring实战》读书笔记-第3章 高级装配
<Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...
- 读书笔记 第四章 创造力
读书笔记 第四章 创造力 创造性工程师的特点 创造性工程师一般具有以下特点: 1.坚持不懈 寻找问题的创造性解决方案需要不断的努力.在工作中总会遇到各种各样的问题,一个成功的创造性工程师永不会放弃.托 ...
- 《老码识途》读书笔记:第一章(上)
<老码识途>读书笔记:第一章--欲向码途问大道,锵锵bit是吾刀(上) 1.赋值语句 对于全局变量赋值语句,例如下面这句: 1 int gi; 2 void main(int argc ...
- 《汇编语言》- 读书笔记 - 第1章-基础知识
<汇编语言>- 读书笔记 - 第1章-基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储 ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
最新文章
- hexo博客更新主题后上传Git操作
- myeclipse添加spket插件
- python课件_讲座直播 | Python在线课堂第二周
- 获取页面和滚动条高度的另一种方法
- windows 下远程登录ubuntu服务器--realVNC
- 笔记-项目管理基础知识-项目目标
- 原创跑酷小游戏《Cube Duck Run》 - - 方块鸭快跑
- ubuntu qt linux 下载文件,Qt ------ linux(ubuntu) 下用 linuxdeployqt 打包发布程序
- 简单的动画函数封装(1)
- 简而不漏,300字Java标识符命名规则规范,看一遍就可以记住,包名类名变量名常量名,让命名有迹可循
- 友盟消息推送服务器demo,友盟消息推送总结
- JEECG开源社区招收学生说明
- bootstrap和圣杯布局
- 【干货】史上最全的Tensorflow学习资源汇总(转)
- delphi7 安装/卸载控件通用方法
- 开发APP需要什么技术?
- 基于MATLAB实现四阶龙格库塔法求解一、二阶微分方程实例
- 查询名字重复但不是相同的人的记录
- 2022-2028年中国冷冻草莓加工行业市场竞争态势及发展趋向分析报告
- 美国大学计算机专业排名2014,2014年美国大学计算机专业排名
热门文章
- 《高效学习OpenGL》之 操作矩阵堆栈 glPushMatrix(),glPopMatrix()
- 成佩涛-项目管理成功之六大因素
- leetCode刷题记录71_561_Array Partition I
- linux如何创建ppt文件,桌面应用|如何在 Ubuntu 和其他 Linux 发行版中创建照片幻灯片...
- 电信CRM建设难点与解决方案
- java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+远程调试
- SIG蓝牙技术规范分享
- 用python模拟多人聊天服务器以及客户端(带图形化界面)
- linux 寄存器ss,段寄存器详解
- 网络安全基础之Windows漏洞复现 (MS08-067)