c++ - 编译器如何从Deleted-default-ctor lambda生成闭包?

标签 c++ c++11 lambda

我想知道如何使用具有默认删除构造函数的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
  • 因为在C++ 20之前它不起作用,但是C++ 20使lambda默认可构造。
  • 如果没有要调用的构造函数,那么该对象如何存在?
  • 最佳答案

    这有点像询问:如果int没有构造函数,那么当对整数进行求值时int对象从何而来?

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

    当编译器看到包含lambda表达式的表达式时,它将继续执行并生成用于在内存中设置闭包对象的代码。不必将该代码打包为一个函数,就像打包构造函数中的代码一样。甚至编译器可能会生成一些仅知道如何调用的构造函数。从用户的 Angular 来看,不涉及构造函数。

    关于c++ - 编译器如何从Deleted-default-ctor lambda生成闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61372314/

    相关文章:

    c++ - 如何比较 std::map 中的所有项目?

    c# - 从列表中获取数据以在代码中使用?

    c++ - RPC、套接字和性能注意事项

    c++ - dynamic_cast 返回相同的对象类型失败,具有多重继承和中间变量

    c++ - 使用 mingw 构建 Qt 5.0

    c++ - 编译器优化如何影响代码逻辑?

    c++ - 当使用私有(private)成员变量时,传递 lambda 是否违反封装?

    c# - 如何使用 LINQ 从通用列表中获取下一个合适的值?

    c++ - glBufferData 不在主函数之外工作

    c++ - 直接放置在 pair 的 std::map 中