【发布时间】:2019-09-06 13:22:06
【问题描述】:
cppreference 表明 lambda 闭包类型构造函数有不同的规则。
默认构造 - 直到 C++14
ClosureType() = 删除; (直到 C++14)
闭包类型不是默认可构造的。闭包类型有 删除(C++14 前)无(C++14 起)默认构造函数。
默认构造 - 自 C++14 起
闭包类型没有(C++14 起)默认构造函数。
默认构造 - 从 C++20 开始
如果没有指定捕获,闭包类型有一个默认的默认值 构造函数。否则,它没有默认构造函数(这包括 存在默认捕获的情况,即使它实际上没有 捕捉任何东西)。
复制赋值运算符 - 直到 C++20
复制赋值运算符被定义为删除(和移动 未声明赋值运算符)。闭包类型不是 可复制。
复制赋值运算符 - 自 C++20 起
如果未指定捕获,则闭包类型具有默认副本 赋值运算符和默认的移动赋值运算符。 否则,它有一个已删除的复制赋值运算符(这包括 存在默认捕获的情况,即使它实际上没有 捕捉任何东西)。
此次规则变更背后的原因是什么?标准委员会是否发现了 lambda 封闭式结构标准中的一些不足之处?如果是这样,这些缺点是什么?
【问题讨论】:
-
是的。 C++20 现在允许在未评估的上下文中使用 lambda open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0315r1.pdf
-
@bolov 很有趣。我必须阅读这篇论文。但是,您能否简要解释一下未评估的上下文如何影响 lambdas 闭包类型的默认构造函数?
-
@AImx1 未评估的上下文不是原因。动机见这篇论文:open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0624r2.pdf
-
@NathanOliver 这确实是正确的动机。感谢您的链接