经过一些搜索和测试,我了解了有关lambda表达式的以下事实。 1)当我们编写lambda表达式时,编译器将为其创建一个匿名函数对象,并将其作为该函数对象的实例; 2)捕获的lambda表达式变量将用于初始化创建的函数对象的成员数据; 3)当我们存储一个lambda函数时,我们实际上得到了函数对象的命名实例; 4)通用lambda函数实际上是函数对象模板; 5)可以使用模板声明和定义存储的(普通甚至通用)lambda表达式;和6)就像函数对象一样,存储的lambda表达式模板甚至可以部分地专门化。

考虑到上述lambda的所有功能,在我看来,通过lambda,我们能够完成以前使用函数对象所做的任何事情,并且关于效率,它们应该具有相同的性能。

另一方面,lambda也有其他优点:1)Lambda表达式比函数对象更易于理解,尤其是对于内联短函数而言;和2)定义存储的lambda可以看作是一种语法糖,用于定义函数对象并为其创建实例。

因此,对我来说,似乎我们没有理由再手动定义函数对象了。

当然,我还需要普遍考虑用lambda代替函数对象,例如1)代替10行以上的函数,将它们定义为存储的lambda可能是不寻常的(甚至不方便,我不知道),和2)在文件级定义lambda可能会(或可能不会,我不太确定)会导致一些意外问题。

这是我的问题:首选lambda代替功能对象是否明智?函数对象还有lambdas没有的其他优点吗?我的担心合理吗?而且,在普遍使用Lambda而不是FO时,我还有其他需要注意的问题吗?

感谢您的回复!

最佳答案

Lambda是某些功能对象的简洁语法。

它们不能被简单地构造,它们可以只有一个(可能是模板)operator(),并且它们的类型必须先访问实例并使用decltype才能被命名。

从C++ 14开始,它们不是constexpr友好的,并且即使它们的状态应该是正常的,也不保证它们可以被普通复制。

除非在同一位置声明,否则具有相同捕获类型和方法的两个Lambda不会共享类型。这可能会导致符号膨胀。

您不能在lamtda中声明()friend bool operator<==之外的其他操作。

鉴于这些重构,请确定使用lambda。 Terseness具有许多实用性。

关于c++ - 选择lambda作为函数对象是否明智?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43433257/

10-11 23:01
查看更多