首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译器如何从已删除的默认ctor lambda生成闭包?

编译器如何从已删除的默认ctor lambda生成闭包?
EN

Stack Overflow用户
提问于 2020-04-22 18:19:08
回答 2查看 71关注 0票数 1

我想知道如何以这种方式使用带有删除-默认构造函数的lambda:

代码语言:javascript
运行
复制
[](){}; // how is this translated by the compiler?

但这不管用:

代码语言:javascript
运行
复制
auto l = [](){std::cout << "lambda expr\n";}; // which ctor is invoked?

decltype (l) g; // doesn't work
  • 因为在C++ 20之前,它不工作,但是C++ 20使lambda默认为可构造。
  • 如果没有可调用的构造函数,该对象是如何存在的?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-22 18:32:09

这有点像在问:如果int没有构造函数,那么在计算整数文本时,int对象来自哪里?

编译器可以在不调用构造函数的情况下创建对象,只需生成在内存中设置对象所需的程序集或机器代码。它只是不允许您在不调用构造函数的情况下创建各种类类型的对象。(尽管在C++20中,由于P0593,这种情况将发生变化。)

当编译器看到包含lambda表达式的表达式时,它只会继续并生成在内存中设置闭包对象的代码。它没有义务将该代码打包为一个函数,即构造函数中的代码打包的方式。编译器甚至有可能生成一些只有它知道如何调用的构造函数。从用户的角度来看,不涉及构造函数。

票数 2
EN

Stack Overflow用户

发布于 2020-04-22 18:30:54

编译器没有编写C++;它不受与我们相同的规则的约束。

在C++20之前,我们不能默认使用C++构造闭包类型。但是,这并没有改变这样一个事实:标准说lambda表达式生成一个闭包类型的对象。所以,编译器必须让它做这件事,而且它从来不需要经过默认的构造函数来完成。那就好了!从来没有任何规定说它必须使用那种机器。

我很抱歉没有一个更令人满意的答案,但它真的只是“因为标准这么说”。

请参见:为什么编译器不能定义内置类型(例如int)?因为!

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

https://stackoverflow.com/questions/61372314

复制
相关文章

相似问题

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