c++ - 更喜欢 lambdas 而不是函数对象是否明智?

标签 c++ lambda function-object

经过一些搜索和测试,我了解了以下有关 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 表达式而不是函数对象是否明智?除了 lambda 之外,函数对象还有其他优点吗?我的担心有道理吗?而且,在普遍使用 lambda 而不是 FO 时,还有其他我应该注意的问题吗?

感谢您的回复!

最佳答案

Lambda 是针对某些类型的函数对象的简洁语法。

它们不能简单地构造,它们只能有一个(可能是模板)operator(),并且它们的类型不能在没有首先访问实例和使用 decltype 的情况下命名。

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

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

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

鉴于这些重构,当然可以使用 lambda。简洁有很多实用性。

关于c++ - 更喜欢 lambdas 而不是函数对象是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43433257/

相关文章:

c++ - 笛卡尔平面无限直线?

c++ - 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符

c++ - 有间接仿函数吗?

c++ - 打印二维表(标题)

c++ - 在 C++ 中存储对象类型的好方法是什么?

c++ - 如何在 Visual Studio 2017 中使用 VC++ 包含目录的子文件夹

c++ - std::function lambda 优化

python - 带有外部库 psycopg2 的 lambda python 函数 - 没有名为 psycopg2 的模块

c# - 用于对集合列表进行排序的 Lambda 表达式

lambda - 如何返回依赖于模板参数的函数类型?