【问题标题】:C++ standard paragraph about member template specialization of unspecialized template关于非特化模板的成员模板特化的 C++ 标准段落
【发布时间】:2018-10-01 15:07:09
【问题描述】:

在当前的 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 的原意是什么?

谢谢。

【问题讨论】:

  • 可能只是它仍然算作一个模板——特化一个成员函数模板并不仅仅把它变成一个非模板函数。
  • 但是该段落指的是什么类型的专业化?明确的专业化?还是来自隐式实例化的专业化?因为如果答案是前者,我认为该段落在当前版本的标准中是不正确的。
  • 任何专业。这两段在我看来并不相关。 17 对特化提供了一些限制,18 只是说成员模板的特化仍然是模板。
  • 第 17 段说,如果不特化其封闭类模板,就不能显式特化成员模板。因此,不能有任何明确的“non-specialized 类模板 [...] 的成员 [...] 的特化”。
  • 注意:这些点是C++17标准(N4659)中的16和17;最新的草稿改变了编号

标签: c++ templates language-lawyer


【解决方案1】:

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

您的第 17 点禁止此类成员的完全专业化;第 18 点阐明了这种情况下的部分特化仍然是一个模板。

术语“显式特化”表示完全特化,不包括部分特化。

template<typename T>
struct A
{
     template<typename U, typename V>
     struct B
     { 
         void f() {}
     };
};

// OK: Partially specialize A<T>::B. This is a template
template<typename T>
template<typename U>
struct A<T>::B<U, int>   
{
    void g() {}
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多