std::to_underlying是C++23新增的枚举转底层整型函数,要求枚举显式声明底层类型,仅接受枚举类型参数,比static_cast更安全、语义更明确,编译期检查严格,性能零开销。

std::to_underlying 是 C++23 新增的工具函数,专为枚举转底层整型设计
它比手动 static_cast 更安全、更语义明确,且只接受枚举类型(编译期检查),避免误转非枚举值。如果你用的是 GCC 13+、Clang 16+ 或 MSVC 19.35+,且已启用 -std=c++23,就能直接用。
必须确保枚举有明确定义的底层类型
否则 std::to_underlying 编译失败——它不支持未指定底层类型的 enum(即传统“无作用域枚举”中未加 : int 等说明的写法)。
enum class Color { Red, Green }; // ❌ 错误:底层类型未显式声明,C++23 中不满足 std::to_underlying 要求enum class Color : int { Red, Green }; // ✅ 正确enum class Status : uint8_t { OK = 0, Err = 1 }; // ✅ 正确
常见误用:试图对非枚举类型或指针调用
编译器会报类似 no matching function for call to 'to_underlying' 的错误,不是因为没包含头文件(它在 <utility> 中),而是参数类型不匹配。
std::to_underlying(42); // ❌ 非枚举std::to_underlying(&e); // ❌ 指针std::to_underlying(e); // ✅ e 是合法枚举对象
注意:返回类型是枚举声明的底层类型(如 int、unsigned long),不是 auto 或通用整型——别假设它和 int 总能隐式互转,尤其在跨平台或位宽敏感场景下。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
替代方案对比:static_cast vs to_underlying
功能上等价,但 std::to_underlying 提供更强约束:
-
static_cast<int>(e)允许对任意可转整型的类型调用,容易掩盖逻辑错误 -
std::to_underlying(e)只接受枚举,且要求底层类型显式,强制你在设计阶段就明确意图 - 性能完全一致——两者都生成零开销指令,无运行时成本
如果你还在用 C++20 或更早标准,只能靠 static_cast;升级到 C++23 后,优先用 std::to_underlying,特别是团队协作或需要长期维护的代码里——它把“这里本应是枚举”的契约写进了类型系统。

















