枚举的直接列表初始化 - 对 enum class 的改进

枚举的直接列表初始化 - 对 enum class 的改进
苏丙榅1. 枚举初始化
在 C++17 之前,给作用域枚举(强类型枚举)变量赋值有时会很麻烦,甚至不得不写强转。C++17 修复了这个痛点,让枚举的使用变得更像普通的整数变量一样自然。
如果我们定义了一个作用域枚举(C++11),想要给它初始化一个值,必须小心翼翼。假设我们有一个代表颜色的枚举:
1 | enum class Color : unsigned int |
如果我们想在代码中临时定义一个灰度值(比如 0),这样做是不行的:
1 | // 错误!C++17 之前不允许用整数直接初始化 enum class |
以前必须显式地告诉编译器:“我知道我在干什么,请把这个整数强转成 Color。”
1 | // 麻烦的旧做法:必须写 static_cast |
这种写法非常繁琐,尤其是在处理底层硬件寄存器、网络协议或者位掩码时,枚举可能代表很多未在枚举定义中列举出的数值,每次都写 static_cast 简直是灾难。
C++17 引入了一个新规则:允许使用花括号初始化列表 {},直接将整数(或其他类型的数值)赋值给枚举变量。只要这个数值在枚举底层类型的范围内(比如 int 范围内),就可以直接用 {} 赋值!
1 | // 使用花括号,直接初始化!不需要 static_cast |
- 这种写法只适用于花括号
{}初始化。 - 如果直接用等号
=、圆括号或独立的花括号来赋值,编译器依然会报错(除非你用了强转)。
1 | Color c3 = 0; // error |
2. 示例代码
为了让大家全面理解,下面准备了一段完整的代码示例,涵盖了普通枚举、作用域枚举(强类型枚举)以及边界情况。
1 |
|
为了帮大家在面试或使用中记住enum class 这个特性,请记住以下三大要点:
必须用大括号
{}:只有
Color c { value };是对的。Color c (value);和Color c = value;在enum class下依然被禁止。底层类型要匹配:给的值必须能塞进枚举的底层类型里。
如果是
enum class E : char,你不能给它赋值999,因为char装不下。这种“缩窄”是不允许的。不需要在 enum 列表里:
{}里的数字不一定要出现在枚举定义{ A, B... }中。这对处理协议里的保留位或未来扩展值非常有用。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果

















