第2章

  1. 模板不是一种类型;它是用于生成许多具有相似结构的不同类型的工厂。模板是用泛型类型编写的;用具体类型替换这些泛型类型,就会生成来自该模板的类型。
  2. 有类模板、函数模板和变量模板。每种模板生成相应的实体 —— 函数模板生成函数,类模板生成类(类型),变量模板生成变量。
  3. 模板可以有类型参数和非类型参数。类型参数是类型。非类型参数可以是整型或枚举值,也可以是模板(在变长模板中,占位符也是非类型参数)。
  4. 模板实例化是由模板生成的代码。通常,实例化是隐式的;使用模板会强制进行实例化。也可以进行显式实例化(无需使用),会生成一个类型或函数,供以后使用。模板的显式特化是指所有泛型类型都被指定的特化;它不是实例化,且在模板使用之前不会生成代码,只是为这些特定类型生成代码的另一种方法。
  5. 通常,参数包是通过递归进行遍历的。编译器通常会内联此递归生成的代码,因此递归仅存在于编译期间(以及阅读代码的开发者的脑海中)。在 C++17(以及很少情况下在 C++14)中,可以在不使用递归的情况下,对整个参数包进行操作。
  6. Lambda 表达式本质上是一种声明,可像函数一样调用的局部类的简洁方式。用于有效地将一段代码存储在变量中(或者更准确地说,将代码与变量关联起来),以便以后调用这段代码。
  7. 概念对模板参数施加了限制。这可用于避免替换会导致,模板体内部出错的类型并进行实例化。在更复杂的情况下,概念可用于消除多个模板重载之间的选择歧义。