| 对比维度 | SFINAE | Concepts |
|---|---|---|
| 报错信息 | 几十行库内部模板实例化堆栈 | 一行"不满足 XXX 约束" |
| 代码可读性 | enable_if<is_integral_v<T> && !is_same_v<T, char>> |
requires Integral<T> && !SameAs<T, char> |
| 复用性 | 每次写一次条件表达式 | 定义一次 Concept,到处用 |
| 编译时间 | 长(大量模板实例化尝试) | 短(约束在模板实例化前检查) |
| 重载优先级 | 靠 SFINAE 的"最匹配"规则 | 自然支持 Concept 偏序(更特化的优先) |
结论:C++20 项目优先用 Concepts。只有需要兼容 C++17 时才保留 SFINAE。