类型化和无类型形参

无类型 参数表示在将表达式传递给模板之前不执行符号查找和类型解析。 这意味着例如 未声明 标识符可以传递给模板:

  1. template declareInt(x: untyped) =
  2. var x: int
  3.  
  4. declareInt(x) # 有效
  5. x = 3
  1. template declareInt(x: typed) =
  2. var x: int
  3.  
  4. declareInt(x) # 无效,因为x尚未声明,因此没有类型

每个参数都是 无类型 的模板称为 立即 模板。 由于历史原因模板可以使用 立即 编译指示进行显式注释,然后这些模板不会参与重载分辨率,编译器会 忽略 参数的类型。 现在不推荐使用显式立即模板。

注意: 由于历史原因 stmt 是类型化 typed 的别名, expr 是无类型 untyped 的别名, 但他们被移除了。