闭包类型什么时候终于变成结构类型了?

问题描述 投票:0回答:1

曾经有一个关于闭包类型是否应该被视为结构类型(本质上决定它们是否有资格作为 NTTP)的长时间讨论。由用户 dfrib 撰写的关于此问题的详细帖子可以在here找到。

最初对此的担忧似乎是由袁志浩早在 2022 年 3 月提出的。这最终成为缺陷报告CWG 2542,并在 2023 年 6 月的工作组会议上被接受。该缺陷报告的拟议决议是已批准,并且非常明确地指出闭合类型不是结构类型。

此更改反映在 C++ 工作草案的许多版本中,至少一直到 N4971。兴趣的通过列在

[expr.prim.lambda.closure]/3
下。这也是人们在查找有关 lambdas 的 cppreference 条目时会发现的内容,该条目引用了页面底部的缺陷报告 CWG 2542

但是,在最新的 C++ 工作草案版本 N4981 中,段落 [expr.prim.lambda.closure]/3 现在显示为:

闭包类型不是聚合类型(9.4.2);它是一个结构性的 当且仅当 lambda 没有 lambda 捕获时,键入 (13.2)。

这似乎恢复了缺陷报告CWG 2542的批准决议。现在这个缺陷报告应该被认为是过时的吗?并且,通过哪个会议/决定/论文,封闭类型现在变成了结构类型?

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

并且,通过哪个会议/决定/文件,闭包类型现在变成了结构类型?

这是P1396,其提出并接受的解决方案是使无捕获 lambda 成为结构类型

这可以从P1396看出:

使无捕获 lambda 的闭包类型成为结构类型

第 2542 期(2023 年 6 月批准)使所有闭包类型都不是结构类型,即不适合用作非类型模板参数。这会导致与没有捕获的闭包类型的指针到函数转换的处理不一致:

拟议决议(CWG 2024-02-02 批准):

7.5.5.2 [expr.prim.lambda.closure]第 3 段的更改如下:

  • 闭包类型不是聚合类型(9.4.2 [dcl.init.aggr])并且不是 ; 它是一种结构类型 (13.2 [temp.param]) 当且仅当 lambda 没有 lambda 捕获时。 实现可以定义不同于 ... 的闭包类型
© www.soinside.com 2019 - 2024. All rights reserved.