C++是否支持constexpr switch?两类模板函数编译等价性需标准确认
C++是否支持
switch constexpr? C++标准中并没有定义专门的switch constexpr语法,但当switch的控制表达式是核心常量表达式时,编译器会在编译阶段完成分支消除,实现和if constexpr一致的编译期优化效果。
针对你给出的两个模板函数:
第一个使用if constexpr的实现:
template <int OP> int mul(int in) { if constexpr (OP == 1) { return in * 2; } else if constexpr (OP == 2) { return in * 3; } else { return in * 4; } }
第二个使用普通switch的实现:
template <int OP> int mul(int in) { switch(OP) { case 1: return in * 2; case 2: return in * 3; default: return in * 4; } }
从C++标准层面来看,这两个实现是编译等价的:
- 模板非类型参数
OP属于核心常量表达式,编译器在实例化模板时必须在编译期计算出OP的值。 - 对于
switch语句,编译器会直接确定唯一可达的分支,将其余不可达分支完全从生成的代码中移除——这和if constexpr强制丢弃未选中分支的行为完全一致。 - 最终两者的编译产物不会包含运行时的分支判断逻辑,都能达到零运行时开销的效果。
你观察到的编译产物一致,正是编译器遵循标准规则进行优化的结果,这种优化是符合标准要求的,而非编译器的额外扩展。
内容的提问来源于stack exchange,提问作者mgNobody
相关产品推荐
相关产品推荐

