繁体   English   中英

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

[英]Why is in-class partial specialization well-formed?

根据[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 ++标准核心语言活动问题No 727示例表明,类内部分特化很好地形成:

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

我确定核心问题文件在这里是正确的,但找不到适当的参考来证实。 你能帮助我吗?

意图是有效 - 见N4090

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

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

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

该规范称为14.5.2p1

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

并且在14.5.5p2

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM