首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >枚举的声明点

枚举的声明点
EN

Stack Overflow用户
提问于 2016-02-29 16:40:48
回答 2查看 551关注 0票数 19

枚举类型的声明点是什么?它是否紧跟在枚举的名称之后?我看到了标准C++ 14 (n4296)§3.3.2/3:

枚举的声明点紧跟在其枚举说明符(7.2)或其第一个不透明枚举声明(7.2)中的标识符(如果有)之后,以先出现的为准

但是当我试图重现它的时候;

代码语言:javascript
复制
template <class T>
struct CL
{
    using UndType = int;
};

enum class E: CL<E>::UndType;  //error: E is undefined

我在所有编译器上都得到了一个错误,尽管枚举E的枚举基础被放在标识符之后,并且必须是可见的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-29 16:44:59

以下内容;

代码语言:javascript
复制
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的分辨率,代码应该是可编译的。

至于目前的变通方法...

这个;

代码语言:javascript
复制
enum class E; // default underlying type is int

是最小声明。

不透明的声明可以是;

代码语言:javascript
复制
enum class E : int; // int base

下面是一个完整的定义(包括枚举器);

代码语言:javascript
复制
enum class E : int {/*...*/};

或者,为了使用类模板,可以使用另一种类型(可能是void)。

代码语言:javascript
复制
enum class E : CL<void>::UndType;
票数 13
EN

Stack Overflow用户

发布于 2022-01-21 03:52:12

现在,CWG2516已为此打开。

我认为这是标准中的一个错误,该标准禁止is_scoped_enum的可移植实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35695071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档