枚举的声明点

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)

  • 来自http://en.cppreference.com/w/cpp/language/enum,基础类型是声明的一部分.`enum class E`等同于`enum class E:int`.将`UndType`更改为`char`甚至会产生错误[Demo](http://coliru.stacked-crooked.com/a/1b7463cc118c5fd6). (5认同)