You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否以Lambda作为默认非类型模板参数生成唯一类型?是否合规安全?

Lambda作为默认非类型模板参数的合法性分析

对应的代码如下:

template <auto = [](){}>
struct A;

using unique_1 = A<>;
using unique_2 = A<>;

结论

这种写法属于病态(ill-formed)行为,完全不安全,不符合C++标准要求。

具体原因

  • 每个Lambda表达式都是独立的闭包对象,拥有唯一的、无命名的类型。每次隐式调用默认模板参数(即写A<>)时,都会生成一个全新的Lambda实例——unique_1和unique_2对应的默认模板参数是两个完全不同的实体,它们的类型、内存地址都不相同。
  • C++标准要求,相同的模板ID(比如这里的A<>)必须对应同一个模板实例。但因为每次默认参数的Lambda都是新生成的,这就违反了模板实例化的一致性规则,编译器有权直接拒绝编译,或者产生未定义行为。
  • 即便部分编译器出于扩展特性暂时支持这种写法,也不具备可移植性,更换编译器或版本后大概率会报错。

内容的提问来源于stack exchange,提问作者cppbest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:12:04