主要观点:C++语言的演进不断带来增强代码安全性、可读性和可维护性的强大特性,本文探讨了 C++17、C++20 和 C++23 中enum class
功能的变化与新增,包括 C++17 中从底层类型进行花括号初始化、C++20 中的using enum
语法以及 C++23 中的std::to_underlying
函数,还提到未来 C++26 可能支持反射等改进。
关键信息:
- C++17:允许从底层类型对
enum class
进行初始化,如Handle h { 42 };
,但仍需谨慎,不能随意传递无类型的值,如process({10});
会报错。 - C++20:引入
using enum
语法,可将枚举器引入当前作用域,使代码更简洁,如using enum ComputeStatus;
,在switch
语句中使用更方便。 - C++23:新增
std::to_underlying
函数,可将枚举值转换为其底层整数类型,如auto value = std::to_underlying(p);
,提高代码可读性。 - 未来改进:C++26 可能支持反射,如
template <typename E> constexpr std::string enum_to_string(E value)
可将枚举转换为字符串,目前可依赖第三方库Neargye/magic_enum
。
重要细节:
enum class
是类型安全的命名常量定义方式,与传统枚举不同,不会隐式转换为整数,如Color color = Color::Red;
。- 在比较
enum class
值时需使用==
,如if (color == Color::Red)
。 - 之前在 C++14 中转换
enum
到底层类型需使用static_cast
,如process(static_cast<Handle>(10));
。 - 可通过
[@Compiler Explorer](https://godbolt.org/)
查看代码运行效果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。