这篇 cppreference.com 文章的结尾有问题

TRP*_*RPh 6 c++ templates specialization

我已阅读模板的隐式专业化意味着什么?及其答案,但我仍然不满意我从 cppreference.com理解部分模板专业化的这一部分:

如果主要成员模板显式(完全)专门用于封闭类模板的给定(隐式)特化,则对于封闭类模板的这种特化,成员模板的部分特化将被忽略......

template<class T> struct A { //enclosing class template
  template<class T2>
  struct B {};  //primary member template
  template<class T2>
  struct B<T2*> {};  // partial specialization of member template
};
         
template<>
template<class T2>
struct A<short>::B {}; // full specialization of primary member template
                       // (will ignore the partial)
        
A<char>::B<int*> abcip; // uses partial specialization T2=int
A<short>::B<int*> absip; // uses full specialization of the primary (ignores partial)
A<char>::B<int> abci; // uses primary
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 评论说该行template<> template<classT2> struct A<short>::B {};是“主要成员模板的完全专业化”。主要成员模板在注释中标识为结构B。行怎么能的专业化B当它A正被由专门的替代shortclass T

  2. B当模板参数T2未指定时,该行如何成为“完全”特化?

  3. 注释和随附的文本表明“显式专业化”和“完全专业化”是同义词。如果上面引用的代码行是 的显式特化B,那么隐式特化在A哪里?

Dav*_*ing 2

类模板的成员可以显式特化,即使它不是模板

\n
template<int I>\nstruct X {\n  int f() {return I;}\n  void g() {}\n};\ntemplate<>\nint X<0>::f() {return -1;}\n
Run Code Online (Sandbox Code Playgroud)\n

这相当于专门化整个类模板,但具有从相关主模板复制的其他成员或部分专门化:

\n
template<>\nstruct X<0> {\n  int f() {return -1;}\n  void g() {}\n};\n
Run Code Online (Sandbox Code Playgroud)\n

(回想一下,这种拼写出来的专门化根本没有义务声明g或作为函数进行声明。)由于您实际上没有编写此内容,因此它仍然被认为是隐式实例化作为X一个整体与给定的改变。

\n

这就是为什么您的专门化A<T>::B提供了模板参数 forA而不是 for B;它正在用另一个模板替换A<T>::B模板(恰好具有相同的模板参数列表)。我想说 \xe2\x80\x9cprimary\xe2\x80\x9d 这个词在这里是误导性的:它是整个模板被替换,这就是为什么此后忽略部分专业化A<short>

\n