枚举类型的声明有什么意义?它是在枚举名称后面吗?我看过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 位于标识符之后且必须可见。
答案 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;