template <>用于成员枚举的显式特化

b1s*_*sub 4 c++ templates language-lawyer

根据17.7.3 [temp.expl.spec]第5段(N4659),

...显式专用类模板的成员以与普通类成员相同的方式定义,而不是使用template<>语法.定义显式专用成员类的成员时也是如此.但是,template<>用于定义专门用作类模板的显式专用成员类模板的成员.

明确的专业化E肯定不属于大胆的情况,它仍然需要template<>.这是为什么?

template<class T> struct A {
    enum E : T;
};

template<> enum A<int>::E : int { eint };
Run Code Online (Sandbox Code Playgroud)

Vau*_*ato 6

此段落与显式专用类模板的成员相关,但您尚未明确专门化类模板.这是它所谈论的案例的一个例子:

template<class T> struct A {
    enum E : T;
};

template<> struct A<int> {
    enum E : int;
};

enum A<int>::E : int { eint }; // no template<> here
Run Code Online (Sandbox Code Playgroud)

在您的示例代码中,您明确template<>指定了主模板的成员,该成员需要使用,如第一段中所指定.

1以下任何一项的明确专业化:

...

(1.7) - 类模板的成员枚举

...

可以通过模板<>引入的声明声明; 即:explicit-specialization:template <>声明

第5段背后的基本原则是,一旦您明确专门化了模板,它就不再是模板,您就像使用任何其他非模板实体一样使用专门化.

  • @ Il-seobBae:是的,但这不是你从标准中提到的段落所说的.它讨论的是一个明确专门的类模板,而不是一个明确的专用成员,而粗体部分则讨论的是一个明确专门的成员类模板,它完全不同. (2认同)