在 C++0x 中指定枚举大小

Specifying enum size in 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 功能吗?

我在 Whosebug claiming that we can define scoped enums with size if we declare them before defining. That answer provided Wiki link 上找到了答案。但是 wiki link 已针对 C++11 进行了更新,并且 C++03 的引用已被删除。

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

Isn't specifying the size of enum is C++11 feature?

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

So can we define or not the size of enum in C++03?

不,我们不能。

Is the code(pasted above)is a valid C++03 code?

不,不是。

I am using C++0x standard

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 之前和 post,你可以做的是 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 或等效编译器标志的所有标准版本,这意味着您可以使用此代码前和 post- C++11.