关于非专用模板的成员模板专业化的C ++标准段落

时间:2018-04-20 20:40:18

标签: c++ templates language-lawyer

在当前的C ++标准草案中,段落[temp.expl.spec]p.18表示:

  

非专业类模板的成员函数模板,成员类模板或静态数据成员模板的特化本身就是一个模板。

然而,上段temp.expl.spec]p.17陈述(我的重点):

  

在类模板成员或出现在命名空间作用域中的成员模板的显式特化声明中,成员模板及其某些封闭类模板可能仍然是非专业的,除了声明不应明确专门化一个类成员模板,如果它的封闭类模板也没有明确专门化。 [...]

因此,显式特殊化成员模板而不专门化其封闭类模板应该是不可能的,因此[temp.expl.spec] p.18是错误的。我突出显示了一词,因为[temp.expl.spec] p.18说“专业化[...]”。专业化可以有很多含义,其中之一可以是明确的专业化。

我检查了[temp.expl.spec] p.18在[temp.expl.spec] p.17之前出现在标准中。例如,在the 1996 version of the standard [temp.expl.spec]中存在p.18,而[temp.expl.spec] p.17不存在。

[temp.expl.spec] p.18的原始意图是什么?

谢谢。

1 个答案:

答案 0 :(得分:2)

非专业类模板的成员类模板可以有部分特化。

您的观点17禁止完全对此类成员进行专业化;第18点澄清了这种情况下的部分专业化仍然是一个模板。

术语“明确专门化”意味着完全专业化,并排除部分专业化。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="my_textarea" class="uk-textarea" rows="5" name="text"></textarea>
<h1 class="chars-counter">0</h1>