Typed 参数和 untyped 参数的比较

untyped 参数表示表达式传递给模板前不执行符号的查找和类型的解析。这意味着,比如,未声明 的标识符也能传递给模板:

  1. template declareInt(x: untyped) =
  2. var x: int
  3. declareInt(x) # 可以
  4. x = 3
  1. template declareInt(x: typed) =
  2. var x: int
  3. declareInt(x) # 不正确,因为此处 x 没有被声明,所以它没有类型

如果一个模板的每个参数都是 untyped 的,则称它为 immediate 模板。 由于历史原因,模板可以用 immediate 编译指示显式地标记,这类模板不参与重载解析,参数的类型也将被编译器 忽略。显式声明的即时模板现在已经弃用。

注意: 由于历史原因, stmt 是 typed 的别名, expr 是 untyped 的别名,但它们都被移除了。