template <auto x = []()>
struct A;
using unique_1 = A<>;
using unique_2 = A<>;
生成这样的独特类型是否安全,或者这是某种格式错误的行为?
自 C++20 起,是的。
来自 [温度参数]/6
非类型模板参数应具有以下类型之一(可能是 cv 限定的):
- 结构类型(见下文),
- 包含占位符类型的类型 ([dcl.spec.auto]),或
- 推导类类型的占位符 ([dcl.type.class.deduct])。
确定其类型时,将忽略 template-parameter 上的顶级 cv-qualifiers。
和 [温度参数]/7
结构类型是以下之一:
- 标量类型,或
- 左值引用类型,或者
- 具有以下属性的文字类类型:
- 所有基类和非静态数据成员都是公共且不可变的并且
- 所有基类和非静态数据成员的类型都是结构类型或其(可能是多维)数组。
由于这样的 lambda 具有以下所有属性,因此它是一个有效的模板参数。
但是,如果您使用它来进行可变 constexpr 编程,请注意根据 CWG 问题 2118
它仍然是格式错误的