模板的隐式特化是什么意思?

时间:2015-02-23 08:06:32

标签: c++ templates

N3797::14/4 [temp]章节(强调我的)

  

模板名称具有链接(3.5)。非成员函数模板可以   有内部联系;任何其他模板名称都应具有外部   连锁。模板的特化(显式或隐式)   内部联系与其他专业不同   翻译单位。

提到了关于隐式专业化的提法。据我从上下文中理解,该概念与具有

的模板显式专业化不同

template < > 声明

语法。所以,我猜测隐式特化与部分类模板特化有关。不幸的是,我无法在当前工作草案中定义隐式专业化概念的规范性参考。

2 个答案:

答案 0 :(得分:2)

没有称为“隐性专业化”的规范性术语 但是,我认为在这种情况下,它意味着“显性专业化”的补充:用户没有明确专业化的每一种专业化,在其他(规范)词语中,实例化专业化
考虑一下

  • 明确的专业化
  • 隐式实例化
  • 明确的实例化

通过后两者实例化的专业化可以称为“隐式专业化”。

答案 1 :(得分:0)

这个术语在标准中没有多大用处,但是我们可以从§14.5.5.3中推断出它的含义 - 下面再现 - 为了方便起见,我将其分为(A),(B)和(C)段。参考文献(boldfacing mine):

  

(A)如果类模板的成员模板是部分专用的,则成员模板部分特化是封闭类模板的成员模板;如果实例化封闭类模板(14.7.1,14.7.2),则每个成员模板部分特化的声明也将作为创建类模板特化成员的一部分进行实例化。

     

(B)如果主要成员模板明确专门用于封闭类模板的给定(隐式)特化,则对于封闭类的此特化,将忽略成员模板的部分特化模板。

     

(C)如果成员模板的部分特化明确专门用于封闭类模板的给定(隐式)特化,则仍会考虑主要成员模板及其他部分特化封闭类模板的这种特殊化。 [例如:

template<class T> struct A {
    template<class T2> struct B {}; // #1
    template<class T2> struct B<T2*> {}; // #2
};
template<> template<class T2> struct A<short>::B {}; // #3

A<char>::B<int*> abcip; // uses #2
A<short>::B<int*> absip; // uses #3
A<char>::B<int> abci; // uses #1
  

- 结束示例]

重复(B)我对括号中的例子的交叉引用:

  

“如果主要成员模板(即#1)明确专门化(如#3),用于封闭类模板的给定(隐式)特化A,成员模板(#2)的部分特化将被忽略,因为这个封闭类模板的专业化“。

我们看到#3的专业化导致忽略#{1}}的#2。因此,我们可以得出以下结论......

absip;

...执行封闭类模板的隐式特化,即template<> template<class T2> struct A<short>::B {}; // #3

因此, 隐式特化 是指成员函数的特化隐式涉及它所属的类模板的特化。换句话说,在#1的成员模板专门化之前,类模板A<short>不需要为A单独的早期专门化,因为它可能是隐式专用的。