C++17、C++20 和 C++23 的枚举类改进

主要观点: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/)查看代码运行效果。
阅读 22
0 条评论