我确信我得到了构造的一般要点,但我无法在c ++中看到它们的目的。我已经在SO和其他地方阅读了关于这个主题的先前帖子,但我不明白为什么它们应该成为一种新的语言功能。
我想回答的事情是
lambda和接受函数/函子的模板参数之间有什么区别。
闭包只是一个具有一些设置对象状态(范围?)的仿函数?
答案 0 :(得分:17)
Lambdas实际上只是一个算子的语法糖。你可以自己完成:定义一个新类,使成员变量保存捕获的值和引用,在构造函数中挂起它们,编写operator()()
,最后创建一个实例并传递它。或者你可以使用lambda,它的代码是1/10,并且工作原理相同。
不捕获的Lambda可以转换为函数指针。所有lambda都可以转换为std::function
,或者获得自己独特的类型,这种类型适用于接受仿函数的模板化算法。
答案 1 :(得分: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表达式允许该定义非常容易,在其使用的地方范围内等等......