可以使用 lambda 作为默认的非类型模板参数吗?

问题描述 投票:0回答:1
template <auto x = []()>
struct A;

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

生成这样的独特类型是否安全,或者这是某种格式错误的行为?

c++ templates lambda language-lawyer
1个回答
0
投票

自 C++20 起,是的。

来自 [温度参数]/6

非类型模板参数应具有以下类型之一(可能是 cv 限定的):

确定其类型时,将忽略 template-parameter 上的顶级 cv-qualifiers

[温度参数]/7

结构类型是以下之一:

  • 标量类型,或
  • 左值引用类型,或者
  • 具有以下属性的文字类类型:
    • 所有基类和非静态数据成员都是公共且不可变的并且
    • 所有基类和非静态数据成员的类型都是结构类型或其(可能是多维)数组。

由于这样的 lambda 具有以下所有属性,因此它是一个有效的模板参数。

但是,如果您使用它来进行可变 constexpr 编程,请注意根据 CWG 问题 2118

它仍然是格式错误的
© www.soinside.com 2019 - 2024. All rights reserved.