概括
从这里(强调添加):https://en.cppreference.com/w/cpp/language/enum --> 在“Scoped enumerations”部分下:
没有从作用域枚举器[AKA: "strong enum"] 的值到整数类型的隐式转换,尽管static_cast
可以用于获取枚举器的数值。
走得更远
在 C++ 中有两种类型的枚举:
- “常规”、“弱”、“弱类型”或“C 风格”枚举,以及
- “作用域”、“强”、“强类型”、“枚举类”或“C++ 风格”枚举。
“作用域”枚举或“强”枚举提供了超出“常规”枚举所提供的两个额外“功能”。范围枚举:
- 不允许从枚举类型隐式转换为整数类型(所以你不能隐式地做你想做的事!),和
- 他们“限定”枚举,以便您必须通过枚举类型名称访问枚举。
1. 枚举类示例(仅在 C++ 中可用):
// enum class (AKA: "strong" or "scoped" enum)
enum class my_enum
{
A = 0,
B,
C,
};
my_enum e = my_enum::A; // scoped through `my_enum::`
e = my_enum::B;
// NOT ALLOWED!:
// error: cannot convert ‘my_enum’ to ‘int’ in initialization
// int i = e;
// But this works fine:
int i = static_cast<int>(e);
第一个“功能”实际上可能是您不想要的东西,在这种情况下,您只需要使用常规的 C 样式枚举来代替!好消息是:您仍然可以像在 C 中所做的那样,通过简单地在枚举类型名称前加上枚举类型名称来为枚举“范围”或“命名空间”,如下所示:
2. 常规枚举示例(在 C 和 C++ 中均可用):
// regular enum (AKA: "weak" or "C-style" enum)
enum my_enum
{
// C-style-scoped through the `MY_ENUM_` prefix
MY_ENUM_A = 0,
MY_ENUM_B,
MY_ENUM_C,
};
my_enum e = MY_ENUM_A; // scoped through `MY_ENUM_`
e = MY_ENUM_B;
// This works fine!
int i = e;
MY_ENUM_
请注意,只需将“范围”添加到每个枚举的前面,您仍然可以获得“范围”的好处!
3. 常规枚举和枚举类一起使用:
在此处测试代码:https ://onlinegdb.com/BkWGqlqz_ 。
主.cpp:
#include <iostream>
#include <stdio.h>
// enum class (AKA: "strong" or "scoped" enum [available only in C++, not C])
enum class my_enum
{
A = 0,
B,
C,
};
// regular enum (AKA: "weak" or "C-style" enum [available in BOTH C and C++])
enum my_enum2
{
MY_ENUM_A = 0,
MY_ENUM_B,
MY_ENUM_C,
};
int main()
{
printf("Hello World\n");
// 1) scoped enum
my_enum e = my_enum::A; // scoped through `my_enum::`
e = my_enum::B;
// IMPLICIT CASTING TO INT IS NOT ALLOWED!
// int i = e; // "error: cannot convert ‘my_enum’ to ‘int’ in initialization"
// But this explicit C++-style cast works fine:
int i1 = static_cast<int>(e);
// This explicit C-style cast works fine too, and is easier to read
int i2 = (int)e;
// 2) regular enum
my_enum2 e2 = MY_ENUM_A; // scoped through `MY_ENUM_`
e2 = MY_ENUM_B;
// This implicit cast works fine / IS allowed on C-style enums!
int i3 = e2;
// These explicit casts are also fine, but explicit casting is NOT
// required for regular enums.
int i4 = static_cast<int>(e2); // explicit C++-style cast
int i5 = (int)e2; // explicit C-style cast
return 0;
}
4.如何迭代枚举:
- *****[我的回答] 如何迭代 1.弱类型 C 风格和 2.作用域、强类型 C++
enum class
枚举的完整示例:如何迭代枚举?
- [我的问答]在 C++ 中迭代枚举类的常用方法是什么?