【问题标题】:Is it wise to prefer lambdas to function objects?更喜欢 lambdas 而不是函数对象是否明智?
【发布时间】:2017-04-16 02:55:36
【问题描述】:

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

鉴于上述 lambdas 的所有特性,在我看来,通过 lambdas,我们可以做我们过去对函数对象所做的任何事情,并且在效率方面,它们应该具有相同的性能。

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

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

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

这是我的问题:更喜欢 lambda 而非函数对象是否明智?函数对象是否还有其他优点,但 lambdas 没有?我的担心合理吗?而且,在普遍使用 lambdas 而不是 FO 时,我还有什么需要注意的吗?

感谢您的回复!

【问题讨论】:

  • a) 不是“匿名的”,而是“独特的、无法命名的名字”。 b) 你刚才说lambda表达式函数对象,那么“比函数对象更易理解”是什么意思?

标签: c++ lambda function-object


【解决方案1】:

Lambda 是特定类型函数对象的简洁语法。

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

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

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

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

鉴于这些重构,当然,使用 lambdas。简洁有很多用处。

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 2022-01-03
    • 2011-06-18
    • 2021-03-23
    • 1970-01-01
    • 2016-09-24
    • 2010-09-24
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多