Lambda 闭包类型构造函数
Lambda closure type constructors
cpp首选项表明lambda闭包类型构造函数有不同的规则。
默认构造 - 直到 C++14
关闭类型() = 删除;(至C++14)
闭包类型不是默认可构造的。闭包类型具有 已删除(直到 C++14)否(自 C++14 年以来)默认构造函数。
默认构造 - 自 C++14 起
闭包类型没有(自 C++14 起)默认构造函数。
默认构造 - 自 C++20 起
如果未指定捕获,则闭包类型具有默认默认值 构造 函数。否则,它没有默认构造函数(这包括 存在捕获默认值的情况,即使实际上没有 捕获任何内容)。
复制赋值运算符 - 直到 C++20
复制赋值运算符定义为已删除(和移动 未声明赋值运算符)。闭合类型不是 可复制可分配。
复制赋值运算符 - 自 C++20 起
如果未指定捕获,则闭包类型具有默认副本 分配运算符和默认的移动分配运算符。 否则,它具有已删除的复制赋值运算符(这包括 存在捕获默认值的情况,即使实际上没有 捕获任何内容)。
规则变化背后的原因是什么?标准委员会是否发现了λ闭包类型结构标准中的一些缺点?如果是这样,这些缺点是什么?
有一个缺点。我们不能像人们想要的那样"即时"使用 lambda。C++20(添加允许在未计算的上下文中使用 lambda)使此代码有效:
struct foo {
int x, y;
};
std::map<foo, decltype([](foo const& a, foo const& b) { return a.x < a.y; })> m;
注意我们如何定义内联比较函数吗?无需创建命名函子(否则可能是个好主意,但我们也不是被迫的)。而且没有必要将声明一分为二:
// C++17
auto cmp = [](foo const& a, foo const& b) { return a.x < a.y; };
std::map<foo, decltype(cmp)> m(cmp); // And also need to pass and hold it!
像这样的用法(以及更多)是进行此更改的激励因素。在上面的示例中,匿名函子类型将带来命名函子类型可以带来的所有好处。默认初始化和 EBO 其中。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 构造函数正在调用一个使用当前类类型的函数
- 具有默认模板类型的默认构造函数的类型推导
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 不命名构造函数和析构函数上的类型错误
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 在 C++17 中调用具有不同参数类型的构造函数
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 无法推断类中的类型,构造函数采用 std::array
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 如何在参数中定义隐式类型转换的构造函数?
- C++ - 打印地图<结构,结构,构造函数>类型
- 继承构造函数+非默认构造函数类型的类内初始化失败
- c++ python构造函数类型错误(可能的命名空间问题)
- 具有构造函数类型转换和转换操作符的转换序列