为什么课堂上的部分专业化很好?

时间:2016-11-17 14:00:01

标签: c++ templates language-lawyer template-specialization partial-specialization

根据[temp.class.spec] 5 /(强调我的)

  

可以声明或重新声明类模板部分特化   在任何命名空间范围对应的主模板可以   定义

这表明部分特化(就像显式特化一样)必须出现在命名空间范围内。这实际上是通过段落下面的例子证实的:

template<class T> struct A {
     struct C {
          template<class T2> struct B { };
     };
};
// partial specialization of A<T>::C::B<T2>
template<class T> template<class T2>
     struct A<T>::C::B<T2*> { };

//...
A<short>::C::B<int*> absip; // uses partial specialization

另一方面,C++ Standard Core Language Active Issues No 727示例表明,课堂内部分专业化很好:

struct A {
  template<class T> struct B;
  template <class T> struct B<T*> { }; // well-formed
  template <> struct B<int*> { }; // ill-formed
};

我确定核心问题文档在这里是正确的,但找不到适当的参考来确认。你能救我吗?

2 个答案:

答案 0 :(得分:1)

意图是有效 - 请参阅N4090

  

在Issaquah 2014中简要讨论了DR 1755 7 和DR 727 8 之后,并基于对核反射器 9 的讨论 10 11 ,似乎Core正在融合以下成员模板及其专业化规则:部分专业化和显式专业化可以是第一个   声明在 最里面封闭的范围或封闭   命名空间范围(认识到明确声明特化)   不构成向一个类添加成员,因此可以完成   在闭幕后)。

     

7 http://www.open­std.org/jtc1/sc22/wg21/docs/cwg_toc.html#727
  8 http://www.open­std.org/jtc1/sc22/wg21/docs/cwg_toc.html#1755
  9 http://accu.org/cgi­bin/wg21/message?wg=core&msg=24366(24033,24290,24309,24368)   
  10 http://accu.org/cgi­bin/wg21/message?wg=core&msg=24731(24731,24732,24736,24738)   
  11 http://accu.org/cgi­bin/wg21/message?wg=core&msg=25168(25168-25179)

我提出了一个核心问题,因为我觉得目前的措辞不够明确;您引用的段落可以解释为禁止类内部分特化。

答案 1 :(得分:1)

该规范称为14.5.2p1

  

可以在类或类模板中声明模板;这样的模板称为成员模板。

并且在14.5.5p2

  

每个类模板部分特化是一个独特的模板,应为模板部分特化的成员提供定义

因此,类模板部分特化是一个模板,它是自然的,因为它仍然具有不固定的参数,因此它表示“类族”。模板可以在类或类模板中声明。