if constexpr 是 C++17 引入的编译期条件判断机制,仅保留为 true 的分支代码并彻底丢弃 false 分支(含语法错误也不报错),适用于模板中根据类型或常量表达式分支且各分支不能同时合法的场景。

if constexpr 是 C++17 引入的关键特性,专用于模板中做编译期条件判断——它让编译器在实例化模板时,**只保留条件为 true 的分支代码,彻底丢弃 false 分支(包括语法错误也不会报错)**。这和运行时的 if 或传统 enable_if SFINAE 完全不同,写法更直观、可读性更强、调试也更容易。
什么时候必须用 if constexpr?
核心场景是:**模板中需要根据类型或常量表达式做分支,且各分支代码不能同时合法**。比如:
- 对
std::string调用.c_str(),但对int调用会编译失败; - 对容器调用
.size(),但对原始数组不能直接调; - 想对浮点类型加
std::abs,对整型用abs,但混写会因重载歧义或不可见声明报错。
这时普通 if 无法解决——所有分支都得能通过语法检查;而 if constexpr 只编译被选中的分支,另一支直接“不存在”。
基本写法与关键规则
语法和普通 if 几乎一样,只是多一个 constexpr:
立即学习“C++免费学习笔记(深入)”;
template<typename T>
auto func(T t) {
if constexpr (std::is_integral_v<T>) {
return t * 2; // 只有 T 是整型时才参与编译
} else if constexpr (std::is_floating_point_v<T>) {
return t + 0.5; // 只有 T 是浮点时才参与编译
} else {
static_assert(sizeof(T) == 0, "不支持的类型");
}
}登录后复制
注意三点:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~