cppreference 显示 lambda 闭包类型构造函数有不同的规则。
默认构造函数 - C++14之前
ClosureType() = delete; (C++14之前)
闭包类型不可默认构造。闭包类型有一个已删除(C++14之前)没有(自C++14起)默认构造函数。
默认构造函数 - 自C++14
闭包类型没有(自C++14起)默认构造函数。
默认构造函数 - 自C++20
如果未指定任何捕获变量,则闭包类型具有被默认定义的默认构造函数。否则,它没有默认构造函数(即使存在捕获默认值,即使它实际上没有捕获任何东西也是如此)。
复制赋值运算符 - C++20之前
复制赋值运算符被定义为已删除(移动赋值运算符未声明)。闭包类型不可赋值。
复制赋值运算符 - 自C++20
即使没有实际捕获任何内容,当存在默认捕获时,也会出现这种情况。如果未指定任何捕获变量,则闭包类型具有被默认定义的复制赋值运算符和移动赋值运算符。否则,它有一个已删除的复制赋值运算符(即使存在捕获默认值,也是如此)。
规则变更的原因是什么?标准委员会是否确定了lambda闭包类型构造标准中的一些缺点?如果确定了,那么这些缺点是什么?