BOOK / SOURCE & READING RECORD
C++ Templates: The Complete Guide
David Vandevoorde; Nicolai M. Josuttis; Douglas Gregor
2nd edition, 2017
C++ Templates: The Complete Guide
已顺序读完第二版第 1–28 章及附录 A–E 的可读正文和文本代码,另交叉阅读官方第 4、23 章。已检查全部 13 幅实质插图对应的 12 个 PDF 页:图 18.1–18.5、D.1 可见且已读;图 13.1、21.1–21.4、27.1、B.1 在取得的 PDF 中仅剩标题或链接、图形缺失(共 7 幅),因此仍列部分覆盖,不把标题当作图像阅读。图 18.4 的图形位于标题前一页,已核对。实际版本为 2017 年出版、版权 2018 的第二版,不冒充第一版阅读。目录、书目、索引不计正文。书中 Concepts 是 C++20 定稿前设计;旧式 -> bool 语法不能当作最终 C++20。
查看版本、实际阅读范围与原文入口 →参数包先有代数,再有语法
参数包把一族接口变成一个模板,并不自动定义空输入、求值顺序与失败语义。折叠表达式首先是括号结构:左折叠与右折叠对于减法就不同。若用逻辑与组成检查器,空集合的结果应是“没有约束被违反”,而运行时失败后不继续检查可以避免无效工作;但这一短路不能替代编译期的表达式有效性检查。第 23 章又提示,编译期也是需要预算的计算过程,递归类型构造会增加实例化与诊断负担。现代值计算优先考虑 constexpr,类型变换才保留必要的模板机制,不能把复杂模板语法本身当成性能收益。
阅读定位:第 4 章 4.2 Fold Expressions、4.3 Variadic Template Applications;第 23 章 23.1、23.3、23.5。
可实例化不是语义正确,零开销也不是零成本
第 19–20 章把类型事实、可替换策略与重载参与条件拆开:检测一个表达式有效,不代表它满足算法需要的顺序关系或单位语义。第 21–26 章则展示布局、构造顺序、转发、类型擦除与 variant 活跃成员状态相互牵制;接口泛化不能忽略对象生存期。第 27 章的表达式模板可合并循环,但 x=A*x 的跨元素别名依赖仍可能要求临时量。第 28 章的最小能力 archetype 用来揭露算法偷偷依赖额外运算,tracer 只能证明所测输入的操作轨迹,不能替代正确性论证。C++20 中优先复用标准 traits、tuple、variant 和具备明确语义的 concepts;需要定制时也分别衡量编译成本、运行成本与维护成本。
阅读定位:19.2、19.4.4、19.7.1;20.3.3、20.5;21.1;22.4–22.6;25.3.4–25.5;26.4.3;27.3;28.3–28.5;附录 E.4。
原文与实际阅读范围
- 第二版官方样页,第 4 章
Variadic Templates 全章 4.1–4.5,书页 55–66。
- C++ Metaprogramming:第二版第 23 章
23.1–23.7,值/类型/混合元编程、实例化成本与历史。
- InformIT 第二版目录与版本信息
第二版版本与完整目录;不是全文。
Pearson 版权所有,第三方完整 PDF 仅保存于私有研究目录;公开可访问不是再分发许可。不托管或链接第三方下载,只发布出版社外链与原创课程。
能下载不等于已经读完;试读章节不等于全书。这里的原创笔记不是原书全文、译本或逐章替代品。
相关基础知识
相关主题链接用于补充背景,不表示这些既有文章已经按整本书核查。