枚举的声明点

Point of declaration for an enumeration

本文关键字:声明 枚举      更新时间:2023-10-16

枚举类型的声明意义何在?它是否紧跟在枚举名称之后?我看到了标准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的可移植实现。