在编译C++时,gcc和clang似乎推迟了模板实例化的类型检查,直到处理完所有程序声明之后.这种语言有保证吗?
为了详细说明,我可以在定义模板或需要模板实例化的位置保持类型不完整,只要我在程序的后面某处完成类型:
class A;
class B;
extern A* pa;
// 1. template definition
template<typename T>
T* f() { return static_cast<T*>(pa); }
// 2. template instantiation
B* test() { return f<B>(); }
// 3. completing types
class A { };
class B : public A { };
Run Code Online (Sandbox Code Playgroud)
请注意,A和B的定义需要键入检查模板实例化(以使static_cast有效).如果省略步骤3,则不再编译第2步.
在我的标题组织中,我可以依赖任何标准C++编译器接受此顺序吗?