为什么枚举不能是模板?

Pap*_*ter 5 c++ templates c++11 enum-class

enumeration cannot be a template是当我尝试使用BCC64(基于 Clang)编译以下代码时给出的错误:

template <typename T> enum class fooEnum : T
{
    a,b,c,d,e
};
Run Code Online (Sandbox Code Playgroud)

起初,我认为这个明确的禁止是由于enum底层类型限制,如果枚举底层类型可以被模板化,那么它可能会导致格式错误的枚举,但是当我们尝试这样做时:

template <typename A> struct fooClass
{
    enum class fooEnum : A
    {
        a,b,c,d,e
    };
};
Run Code Online (Sandbox Code Playgroud)

只要A类型遵循与枚举底层类型相同的限制,它就可以毫无问题地编译,您知道,定义枚举值的表达式:

  • 应该是一个足够大的整数常量以适合枚举的所有值
  • 每个枚举类型应与char或 一个signed/unsigned整数类型兼容。

如果我们不遵循此规则,(使用类内枚举或全局枚举)会出现另一个特定错误,正如预期的那样:

enum class fooEnum : fooClass
{
    a,b,c,d,e
};
Run Code Online (Sandbox Code Playgroud)

非整数类型“fooClass”是无效的基础类型

所以,这就是为什么我想知道为什么即使已经控制了底层类型,也明确禁止创建模板枚举。标准上哪里提到了这个禁令?

感谢您的关注。

Lor*_*eto 3

根据定义 [C++ 标准 14.1],或者在定义之外,

模板定义一系列类或函数或一系列类型的别名。

枚举不是其中任何一个,因此它不能是模板。