如何解决在 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
的引用已被删除。
那么我们可以定义或不定义enum
中C++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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。