我想知道如何使用具有默认删除构造函数的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
最佳答案
这有点像询问:如果int
没有构造函数,那么当对整数进行求值时int
对象从何而来?
只需通过生成在内存中设置对象所需的程序集或机器代码,编译器就可以在不调用构造函数的情况下创建对象。它只是不允许您在不调用构造函数的情况下创建各种类类型的对象。 (尽管在C++ 20中,由于P0593,这将改变。)
当编译器看到包含lambda表达式的表达式时,它将继续执行并生成用于在内存中设置闭包对象的代码。不必将该代码打包为一个函数,就像打包构造函数中的代码一样。甚至编译器可能会生成一些仅知道如何调用的构造函数。从用户的 Angular 来看,不涉及构造函数。
关于c++ - 编译器如何从Deleted-default-ctor lambda生成闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61372314/