在 C++0x

问题描述

我对 C++03 中的非作用域枚举行为有疑问。我已经阅读了多个关于 Stack Overflow 和其他页面的问题和文章。

我使用 C++0x 标准并在 GCC 4.6.4 上运行

我能够定义具有大小的非作用域枚举(如int)。参考godbolt

#include<iostream>

enum Enum: int;
enum Enum: int
{
    first,second,third
};
 
int main()
{
    int numbers = first;
    switch (numbers)
    {
        case first: break;
        case second: break;
        default: break;
    }
    return 0;
}

不是指定枚举的大小是 C++11 特征吗?

我在 StackOverflow 上找到了一个答案,声称如果我们在定义之前声明它们,我们可以定义具有大小的范围枚举。该答案提供了 Wiki 链接。但是 C++11 的 wiki 链接已更新,C++03 的引用已被删除。

那么我们可以定义或不定义enumC++03 的大小吗?代码(粘贴在上面)是有效的 C++03 代码吗?如果我们可以定义,那么它会影响 enum 的基础类型吗?

解决方法

指定 enum 的大小不是 C++11 的特性吗?

您似乎是指指定底层类型。是的,它是在 C++11 中引入的。

那么我们可以在 C++03 中定义或不定义 enum 的大小吗?

不,我们不能。

代码(粘贴在上面)是有效的 C++03 代码吗?

不,不是。

我使用的是 C++0x 标准

C++0x 是正在开发的 C++11 的名称。在选择这个名字时,他们可能希望在 2010 年之前发布。

因此,如果您使用“C++0x”,那么您使用的是 C++11 标准草案的实验性实现,因此此功能可能可用。请注意,完全支持 C++11 的较新 GCC 仍然接受 -std=c++0x 选项,在这种情况下,您实际上将使用 C++11 的完整和稳定实现。不过 GCC 4.6.4 没有完全支持。

同样,C++1y 是 C++14 的工作名称,C++2a 对应 C++20,C++2b 对应 C++23(希望如此)。

,

我想指出,对于 非作用域 枚举,无论是 C++11 之前还是之后,您可以做的是 wrap the enum in a Typesafe Idiom idiom 以指定您的大小想要。

(考虑到:一旦你这样做,包装类型是 class 类型,而不是 enum 或标量类型)

或者,对于 GCC,您可以向枚举添加一个值,该值具有所需大小的最大有效值(例如:(uint64_t)-1 用于 64 位枚举)/最大负值,然后启用 --fshort-enums 标志,这将确保枚举具有适合您的值的最小整数的类型。在您的示例中,您需要以下内容:

enum Enum
{
    first,second,third,_dummy = INT_MIN
};

不要引用我,但这应该可以在编译器实现 -fshort-enums 或等效编译器标志的所有标准版本中移植,这意味着您可以在之前和之前使用此代码后 C++11。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...