C++ 0x lambdas和operator(),闭包和仿函数之间的区别

Cap*_*ffe 8 c++ lambda closures c++11

我有信心获得构造的一般要点,但我无法在c ++中看到它们的目的.我已经在SO和其他地方阅读了有关该主题的先前帖子,但我不明白为什么它们应该成为新的语言功能.

我想回答的问题就是这样

  • lambda和接受函数/函子的模板参数之间有什么区别.

  • 闭包只是一个具有一些设置对象状态(范围?)的仿函数?

  • 这些结构的"杀手级应用"是什么?或者也许是典型的用例?

Ben*_*igt 17

Lambdas实际上只是一个仿函数的语法糖.你可以自己完成:定义一个新类,使成员变量保存捕获的值和引用,在构造函数中挂起它们,编写operator()(),最后创建一个实例并传递它.或者你可以使用一个代码为1/10的lambda并且工作原理相同.

不捕获的Lambda可以转换为函数指针.所有lambdas都可以转换为std::function或者获得自己独特的类型,这种类型适用于接受仿函数的模板算法.


Edw*_*nge 11

好吧,你实际上是在问一堆不同的问题,可能是因为你并不完全熟悉术语.我会尽力回答所有问题.

lambda和"operator()"之间有什么区别? - 让我们改写一下,"lambda和带有operator()的对象有什么区别?"

基本上没什么.主要区别在于lambda表达式创建功能对象,而具有operator()的对象是功能对象.最终结果类似于考虑相同但可以使用(params)语法调用的实体.

闭包和仿函数有什么区别?这也很困惑.请查看此链接:

http://en.wikipedia.org/wiki/Closure_(computer_programming) http://en.wikipedia.org/wiki/Closure_(computer_programming)#C.2B.2B

因此,正如您所看到的,闭包是一种"仿函数",它在一个范围内定义,以便它吸收该范围内可用的变量.换句话说,它是一个在程序运行期间动态构建的函数,并且该构建过程由包含它的范围的运行时值参数化.因此,在C++中,闭包是lambda,它使用构建lambda的函数中的值.

lambda和接受函数/函子的模板参数有什么区别? - 这再次混淆了.不同之处在于它们真的没什么两样.接受函数/函子的模板"参数"已经混淆了措辞,所以我假设"参数"你的意思是"函数",因为参数不接受任何东西.在这种情况下,尽管lambda可以接受一个仿函数作为参数,但它不能被模板化,一个.二,通常lambda是作为参数传递给接受仿函数参数的函数的一个.

闭包只是一个具有一些设置对象状态(范围?)的仿函数?

正如你可以通过上面的链接看到的,没有.事实上,封闭甚至没有状态,真的.基于UPON构建它的其他实体的状态构建闭包,在该仿函数中虽然这不是状态,但它是对象的结构.

这些结构的"杀手级应用"是什么?或者也许是典型的用例?

我会改写一下,"为什么这些东西有用?"

好吧,一般来说,如果任何对象具有operator(),则将其视为函数的能力对于整个事物非常有用.首先,它允许我们通过使用对象或自由函数来扩展任何stdlib算法的行为.无法消除这方面的大量有用资源.

更具体地说,lambda表达式,它们只是简化了这个过程.对象定义所施加的限制使得在某些情况下使用stdlib算法的过程效率稍低(从开发使用的角度来看,而不是程序效率).首先,至少任何作为参数传递给模板的对象都必须在外部定义.我相信这也在改变,但仍然......必须创建整个对象只是为了执行基本的东西,只在一个地方使用,是不方便的.Lambda表达式允许该定义非常容易,在其使用的地方范围内等等......