首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解Lambda闭包类型如何删除默认构造函数

了解Lambda闭包类型如何删除默认构造函数
EN

Stack Overflow用户
提问于 2015-10-02 16:30:31
回答 2查看 7.9K关注 0票数 11

调自5.1.2

19 .与lambda表达式关联的闭包类型有一个已删除(8.4.3)默认构造函数和一个已删除的复制赋值操作符。它有一个隐式声明的复制构造函数(12.8),并且可能有一个隐式声明的移动构造函数(12.8)。注意:复制/移动构造函数的定义方式与任何其他隐式声明的复制/移动构造函数将被隐式定义的方式相同。-end注记

我正在阅读C++ Primer14.8.1,这解释了编译器将lambda表达式翻译成未命名类的未命名对象。如果删除默认构造函数,如何定义不包含lambda捕获的lambda函数的对象?

代码语言:javascript
运行
复制
 auto g = [](){};

这在概念上不是和.

代码语言:javascript
运行
复制
 class lambdaClass{
 public:
      lambdaClass() = delete;
      lambdaClass& operator=(const lambdaClass&) = delete;
      void operator()(){ }

      //copy/move constructor and destructor implicitly defined
};

auto g = lambdaClass(); //would be an error since default is deleted.

如果存在捕获,则将定义默认构造函数以外的构造函数,并且可以初始化该构造函数的对象(只要传递了参数)。但是,如果没有捕获并删除默认构造函数,那么创建lambda类对象在概念上似乎就不一致了。

编辑:嗯,也许关于lambda类根据其lambda捕获创建构造函数的概念是没有根据的,尽管它在C++ Primer中是这样描述的(我在标准中找不到它的引号),因为下面的代码不起作用,尽管我希望它在概念上是这样的:

代码语言:javascript
运行
复制
int sz = 2;
auto a = [sz](){ return sz;};
decltype(a) b(10); //compiler error
decltype(a) b = a; //all good though
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-02 18:18:52

闭包lambda之间的关系类似于对象

C++11标准说闭包!类型没有默认的构造函数,这是正确的,因为它没有说它没有构造函数。

lambda用于创建一个闭包。但是您引用的段落将更改为C++14。

代码语言:javascript
运行
复制
ClosureType() = delete;                     // (until C++14)
ClosureType(const ClosureType& ) = default; // (since C++14)
ClosureType(ClosureType&& ) = default;      // (since C++14)

闭包类型不是DefaultConstructible。闭包类型具有a deleted (until C++14) no (since C++14)默认构造函数。复制构造函数和移动构造函数是implicitly-declared (until C++14)声明的as defaulted (since C++14),可以根据复制构造函数和移动构造函数的通常规则隐式定义。

http://en.cppreference.com/w/cpp/language/lambda

票数 9
EN

Stack Overflow用户

发布于 2020-08-28 02:47:51

因为赋值的右边是临时对象(Rvalue),所以'g‘是由移动赋值分配的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32911729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档