Function Template 两阶段编译检查


1. 在模板定义阶段,模板的检查并不包含类型参数的检查。只包含下面几个方面:

  • 语法检查。比如少了分号。
  • 使用了未定义的不依赖于模板参数的名称(类型名,函数名,......)。
  • 未使用模板参数的 static

2.在模板实例化阶段,为确保所有代码都是有效的,模板会再次被检查,尤其是那些依赖于类型参数的部分。

template
void foo(T t)
{
undeclared(); // 如果 undeclared()未定义,第一阶段就会报错,因为与模板参数无关

undeclared(t); //如果 undeclared(t)未定义,第二阶段会报错,因为与模板参数有关

static_assert(sizeof(int) > 10,"int too small"); // 与模板参数无关,总是报错

static_assert(sizeof(T) > 10, "T too small"); //与模板参数有关,只会在第二阶段报错
}

需要注意的是,有些编译器并不会执行第一阶段中的所有检查。因此如果模板没有被至少实 例化一次的话,你可能一直都不会发现代码中的常规错误。

相关