枚举类型的声明点是什么?它是否紧跟在枚举的名称之后?我看到了标准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
的枚举基础被放在标识符之后,并且必须是可见的。
发布于 2016-02-29 16:44:59
以下内容;
enum class E : CL<E>::UndType;
在当前的一些实现(测试过的clang++、g++和MSVC)中不能被接受为有效的声明。在基于枚举的CL<E>::UndType
中,它们不接受尚未完成的类型E
。在测试的实现中给出的错误是,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;
发布于 2022-01-21 03:52:12
现在,CWG2516已为此打开。
我认为这是标准中的一个错误,该标准禁止is_scoped_enum
的可移植实现。
https://stackoverflow.com/questions/35695071
复制相似问题