枚举的声明点
Point of declaration for an enumeration
枚举类型的声明意义何在?它是否紧跟在枚举名称之后?我看到了标准C++ 14 (n4296) §3.3.2/3:
枚举的声明点紧跟在 标识符(如果有)在其枚举说明符 (7.2) 或其第一个 不透明枚举声明 (7.2),以先到者为准
但是当我试图重现它时;
template <class T>
struct CL
{
using UndType = int;
};
enum class E: CL<E>::UndType; //error: E is undefined
我在所有编译器上都出现了错误,尽管枚举E
的枚举基放在标识符之后并且必须可见。
以下内容;
enum class E : CL<E>::UndType;
在某些当前实现(经过测试的 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
是最小声明。
不透明的声明可以是;
enum class E : int; // int base
以下是完整的定义(包括调查员);
enum class E : int {/*...*/};
或者要使用类模板,可以使用另一种类型(可能是void
)。
enum class E : CL<void>::UndType;
现在CWG2516为此打开了。
我相信这是标准中的一个错误,它禁止is_scoped_enum
的可移植实现。
- 访问在 C++ 结构中声明的枚举变量
- 如何使用默认值将枚举声明为 extern
- 如何转发声明枚举?
- 如何将枚举类转发声明为模板化类的内部类?
- 枚举前向声明与头文件
- C++:如何在声明枚举类的模板类主体之外定义枚举类?
- 在C++代码中使用的 C 标头中向前声明枚举
- 在哪里声明枚举
- 在模板参数内向前声明枚举类
- 在C++14中,在哪个作用域中声明了重新声明枚举的非范围枚举器
- 在C中定义的C++中正向声明枚举
- 在不膨胀命名空间的情况下在C++中声明枚举的好方法
- 声明枚举标识符的基础类型
- 为什么在向前声明枚举时必须提供枚举的大小?
- 前向声明枚举类不起作用
- 在运行时有条件地声明枚举(C++)
- 我可以传递前向声明枚举的值吗?
- c++ -对声明枚举感到困惑
- c++:在类内部从外部声明枚举器,以便可以在私有成员中使用
- 在声明枚举之前使用它