夜雨聆风学习资料网

ARTICLE · 1337135

写了几年模板元编程,你真的搞懂 requires

写了几年模板元编程,你真的搞懂 requires

写了几年模板元编程,你真的搞懂 requires

最近重构模板库,把几十个 SFINAE 重载换成 C++20 requires,编译时间直接降了一个数量级。

SFINAE 太吃性能。每次匹配都靠类型代换试错,失败节点占着内存根本释放不掉。几百次调用就堆出几十万个死节点,编译越跑越慢。Concepts 改成满足性缓存,false 的候选直接剔除,不再造无用节点。

但 requires 有四个坑,最容易栽:

简单要求只查语法的合法性。漏写 requires 关键字,常量比较会被当成普通语句静默放行。
漏写 typename,类型要求会退化成成员探测,同名静态变量还会让结果反着来。
复合要求的 decltype 保留值类别。返回引用的表达式会被推导成引用类型,same_as 严格比对直接失败。
嵌套要求才真正做布尔断言,想校验编译期常量必须写 requires。

还有个更隐蔽的坑:编译器只看具名 concept 里的 &&、||。括号包住的表达式、或者塞进 constexpr 函数里,都会被当成一个整体原子约束。哪怕逻辑上更严,编译器也看不出来,照样报歧义。

所以写特化版本一定要先拆出具名 concept。不过 SFINAE 也没彻底淘汰——返回类型依赖模板实参内省的场景,还得靠它。

原文写了几年模板元编程,你真的搞懂 requires 内部的四类要求与 decltype 值类别陷阱了吗?
作者提示: 个人观点,仅供参考
广东,4小时前,

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料