use*_*538 18 c++ enums declaration c++11 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
Run Code Online (Sandbox Code Playgroud)
我在所有编译器上都有一个错误,虽然枚举的枚举E位置在标识符之后并且必须是可见的.
Nia*_*all 13
下列;
enum class E : CL<E>::UndType;
Run Code Online (Sandbox Code Playgroud)
在当前的一些实现中不被接受为有效声明(经过测试的clang ++,g ++和MSVC).他们不接受,迄今仍未完全型E,在枚举的基础 CL<E>::UndType.测试实现中给出的错误E是在那时未声明的.他们似乎将声明点置于枚举基础的末尾,他们认为一旦声明完成就宣布它.
阅读规格时;
§14.3.1/ 2模板类型参数
[注意:模板类型参数可能是不完整类型(3.9). - 结束说明]
和
§7.2/ 6枚举声明
其基础类型是固定的枚举是一个不完整的类型,从声明(3.3.2)到紧跟其枚举(如果有)之后,它就变成了一个完整的类型.
暗示它是可编译的; 与CRTP实现的情况一样.
我要注意这是否(如果编译失败enum class E : CL<E>::UndType;)是意图还是被视为用例.根据规范,不透明的枚举声明给出了一些基本类型的"特殊"处理,并且要求它必须是整数类型.
据推测,考虑到CWG#1482的解决方案,代码应该是可编译的.
至于当前的解决方法......
这个;
enum class E; // default underlying type is int
Run Code Online (Sandbox Code Playgroud)
是最低声明.
不透明的声明可以是;
enum class E : int; // int base
Run Code Online (Sandbox Code Playgroud)
以下是完整定义(包括调查员);
enum class E : int {/*...*/};
Run Code Online (Sandbox Code Playgroud)
或者,要使用类模板,void可以使用其他类型(可能).
enum class E : CL<void>::UndType;
Run Code Online (Sandbox Code Playgroud)