![]() |
1
14
您永远无法知道lambda函数的类型,因为在逻辑上,编译器会生成一个(本地)类,函数调用运算符重载,并且该(本地)类的数据成员表示词法闭包。这是lambda函数在逻辑上发生的情况,例如:
编译器逻辑上这样做:
由于编译器生成一个(本地)类,它会生成一个名称,因此您永远不能显式地写入该类型,因此您只能从模板函数参数的类型扣除或使用auto/decltype推断该类型。 此外,C++0x闭包是静态分配的,因此无论如何都不能安全地返回原始C++0x闭包。 尽管有几种方法可以实现这一点,但第一种方法更灵活,支持捕捉词汇范围的lambda函数。使用std::function,如果您有一个lambda函数,它没有从外部范围捕获任何内容,那么您可以使用函数指针,但是这种转换更多的是用于处理遗留代码,而不是任何东西。 所以基本上你想要的是:
为什么我一直在逻辑地说,是因为这是如何推进:lambda类型的作品最初(即使C++ 03不允许本地类在模板函数参数中使用)和添加lambda函数的想法源自何处,但由于这是一个语言特征,现在编译器供应商可以在不同和M中实现它。更有效的方法是,当通过引用捕获所有环境时,编译器只需向调用堆栈传递一个指针,而不是以逻辑方式传递,同时仍然维护逻辑视图。 |
![]() |
2
6
从 Wikipedia :
VC10编译此
印刷品 12 30 |
![]() |
Abhijit Sarkar · 如何修复“闭包可能比当前函数更有效” 3 年前 |
![]() |
Houman · 如果未调用闭包,如何使XCTest失败? 7 年前 |
![]() |
Kapil_A · 如何将swift中使用的闭包写入目标c? 7 年前 |
![]() |
Xendar · Jenkins管道模拟Groovy 7 年前 |
![]() |
Ibrahim Mohammed · 函数不考虑闭包 7 年前 |