C ++ 0x – lambda表达式看起来和Java的匿名内部类一样吗?

我在c ++和Java上下文中对lambda表达式的解释是否正确?

它们并不完全相同。 两者都创建了未命名的类,但它们的相似性在此时结束。

在C ++中,您可以创建一个捕获局部变量的闭包,可选择通过引用。 在Java中,您只需获取当前局部变量值的快照(这些变量必须是“最终”)。

匿名内部类的目的是扩展另一个类或实现另一个ad-hoc接口。 因此,匿名内部类可以在某种程度上模拟lambda表达式的作业,例如通过实现Runnable接口。 Lambda表达式专门设计用于调用,并可能修改其环境中的局部变量。

Java匿名内部类可以引用封闭方法中的final数据,以及封闭类中的所有数据(包括可变)。 因此,匿名类中的方法不能更改封闭方法中的变量值,但它们可以更改封闭类中的成员值。

C ++ lambda可以引用封闭函数中的所有数据(包括mutable),如果它嵌套在成员函数中,那么它可以对封闭类的数据执行相同的操作。 程序员声明了对封闭范围的精确依赖程度,因此它是显式的而不是隐式的。

这使得它们非常相似,但Java特性以不同的方式处理方法中的局部变量/参数,原则是它们不应该从方法外部变化,特别是在传统上如此随意地使用线程的语言中。

与C#lambdas相比,它没有任何限制,所有依赖都是隐式的。 这使得它们成为迄今为止这些特征中最不详细的特征(也有助于它们具有最佳类型推断)。 但是在缺点方面,它们使所有关于线程的简单规则无效,即局部变量“在线程堆栈上”并且因此在访问之前从不需要锁定不再是必然的。

C ++ 0x lambda表达式是未命名的方法 ,Javas匿名类是未命名的类 。 所以他们没有名字,但概念不同。

从最明显的事实开始,lambda函数(可能)返回一个值,匿名类可用于创建实例(对象)。

BTW – 维基百科提到,只有lambda 函数被提议用于C ++ 0x。