C++ constexpr 校验:把不变量提前到编译期
背景 协议编号、重试上限和静态路由表往往很久不变。把这种约束留到启动时检查,会让错误跨过编译、测试和发布多个阶段。 核心判断 常量约束尽量通过 static_assert 表达。 复杂配置表先写 constexpr 校验函数,再断言排序、唯一性和范围。 运行时输入继续做运行时校验,编译期检查不能验证配置文件内容。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 constexpr int max_retry = 3; static_assert(max_retry > 0 && max_retry <= 10, "invalid retry limit"); 边界与误区 constexpr 表示表达式具备常量求值能力,不代表所有调用都在编译期执行。不要为了编译期技巧引入难读的模板层次。 验证方式 故意把重试上限改为零或超出范围,确认构建失败且错误提示明确。复杂表还要增加重复编号和空表的编译测试。 小结 配置表、协议编号和数组尺寸等稳定约束应尽早由编译器证明。