模板在其自身定义中的隐式实例化

Implicit instantiation of the template within its own definition

本文关键字:实例化 定义      更新时间:2023-10-16

让我们考虑一下关于模板隐式实例化的简单示例:

#include <iostream>
template<int N>
class A
{
    static const int a = A<N-1>::a; //1, OK, doesn't require implicit intantiation
};
template<int N>
class B
{
    static const int a = B<1>::a; //2, Error, implicit instantiation of template 'B<1>' within its own definition
};

int main(){ }

演示

标准并不清楚这一事实。它只是说N3797::14.7.1/1 [temp.inst]:

除非类模板专门化已经明确实例化(14.7.2)或显式专用(14.7.3),类当在需要完全定义的对象类型,或者当类的完整性类型会影响程序的语义。

1和2都不需要完全定义类类型,但是第二个导致了隐式实例化的错误。我想知道为什么。

我认为B<1>立即失败而A<N-1>没有失败的原因是因为温度。res#general-8.4

可以在任何实例化之前检查模板的有效性。程序格式错误,无需诊断,如果:

由于一个不依赖于模板参数的构造,模板定义后的假设实例化将是不正确的

相关文章: