优先使用lambdas来运行对象是明智的吗?

时间:2017-04-16 02:55:36

标签: c++ lambda function-object

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

鉴于上面提到的lambdas的所有特性,在我看来,通过lambdas,我们能够做任何我们用来处理函数对象的事情,并且关于效率,它们应该具有相同的性能。

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

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

当然,我也有一些担心将lambdas替换为普遍的函数对象,比如1)比10行更多的函数,将它们定义为存储的lambda可能是不寻常的(甚至是尴尬的,我不是知道),2)在文件级定义lambda可能(或可能不是,我不太确定)会导致一些意想不到的问题。

以下是我的问题:喜欢lambdas功能对象是明智的吗?函数对象有没有其他优点,但lambda不是吗?我的担忧是否合理?并且,在普遍使用lambdas而不是FO时,我是否应该注意其他任何问题?

感谢您的回复!

1 个答案:

答案 0 :(得分:4)

Lambdas是某些函数对象的简洁语法。

它们不能简单地构造,它们可以只有一个(可能是模板)运算符(),如果没有首先访问实例并使用decltype,则无法命名它们的类型。

从C ++ 14开始,它们不是constexpr友好的,并且即使它们的状态应该也不能保证它们可以轻易复制。

具有相同捕获类型和方法的两个lambda不共享类型,除非在同一位置声明;这可能导致符号臃肿。

()之外,您不能在lambda中声明其他操作,例如friend bool operator<==,或其他任何操作。

鉴于这些重建,当然,请使用lambdas。 Terseness有很多实用性。