枚举的声明点

时间:2016-02-29 08:40:48

标签: c++ c++11 enums declaration c++14

枚举类型的声明有什么意义?它是在枚举名称后面吗?我看过Standard C ++ 14(n4296)§3.3.2/ 3:

  

枚举的声明点紧随其后   enum-specifier(7.2)或其第一个中的标识符(如果有)   opaque-enum-declaration(7.2),以先到者为准

但是当我尝试重现它时;

template <class T>
struct CL
{
    using UndType = int;
};

enum class E: CL<E>::UndType;  //error: E is undefined

我在所有编译器上都有错误,但枚举E enum-base 位于标识符之后且必须可见。

1 个答案:

答案 0 :(得分:13)

以下内容;

enum class E : CL<E>::UndType;

在某些当前实现中不被接受为有效声明(经过测试的clang ++,g ++和MSVC)。他们不接受 enum-base E中尚未完整的类型CL<E>::UndType。测试实现中给出的错误是E在此时未声明。他们似乎将声明点放在 enum-base 的末尾,他们认为它一旦完成就会被声明。

阅读规格时;

§14.3.1/ 2模板类型参数

  

[注意:模板类型参数可能是不完整类型(3.9)。 - 结束说明]

并且

§7.2/ 6枚举声明

  

其基础类型是固定的枚举是一个不完整的类型,从声明(3.3.2)到紧跟其枚举(如果有)之后,它就变成了一个完整的类型。

暗示它是可编辑的;与CRTP实施的情况一样。

我要注意,如果这是(或编译失败enum class E : CL<E>::UndType;)是故意还是被视为用例。根据规范,不透明的枚举声明给予了一些“特殊”处理w.r.t.它的基本类型以及它必须是整数类型的要求。

据推测,代码应该是可编译的,因为分辨率为CWG#1482

至于目前的解决方法......

此;

enum class E; // default underlying type is int

是最低声明。

不透明声明可以是;

enum class E : int; // int base

以下是完整定义(包括枚举数);

enum class E : int {/*...*/};

或者要使用类模板,可以使用其他类型(可能void)。

enum class E : CL<void>::UndType;