![]() |
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 |
![]() |
Nana Ba · 让这个匿名内部类成为lambda 7 年前 |
![]() |
Pyram · 在Javascript中设置匿名函数的变量 7 年前 |
![]() |
dannylindquist · c#-传递匿名函数而不是连接事件 9 年前 |
![]() |
DomB · R: 使用匿名函数创建虚拟变量 9 年前 |
![]() |
Suo6613 Saxon · 特定匿名函数的用途 10 年前 |