能否以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
相关产品推荐
相关产品推荐

