我想知道如何以这种方式使用带有删除-默认构造函数的lambda:
[](){}; // how is this translated by the compiler?但这不管用:
auto l = [](){std::cout << "lambda expr\n";}; // which ctor is invoked?
decltype (l) g; // doesn't work发布于 2020-04-22 18:32:09
这有点像在问:如果int没有构造函数,那么在计算整数文本时,int对象来自哪里?
编译器可以在不调用构造函数的情况下创建对象,只需生成在内存中设置对象所需的程序集或机器代码。它只是不允许您在不调用构造函数的情况下创建各种类类型的对象。(尽管在C++20中,由于P0593,这种情况将发生变化。)
当编译器看到包含lambda表达式的表达式时,它只会继续并生成在内存中设置闭包对象的代码。它没有义务将该代码打包为一个函数,即构造函数中的代码打包的方式。编译器甚至有可能生成一些只有它知道如何调用的构造函数。从用户的角度来看,不涉及构造函数。
发布于 2020-04-22 18:30:54
编译器没有编写C++;它不受与我们相同的规则的约束。
在C++20之前,我们不能默认使用C++构造闭包类型。但是,这并没有改变这样一个事实:标准说lambda表达式生成一个闭包类型的对象。所以,编译器必须让它做这件事,而且它从来不需要经过默认的构造函数来完成。那就好了!从来没有任何规定说它必须使用那种机器。
我很抱歉没有一个更令人满意的答案,但它真的只是“因为标准这么说”。
请参见:为什么编译器不能定义内置类型(例如int)?因为!
https://stackoverflow.com/questions/61372314
复制相似问题