lambda 和 std::function 有什么区别?

Luk*_*Man 5 functional-programming functor c++11

在此示例中:

auto f = [](int some, int some2){
   //do something
};
Run Code Online (Sandbox Code Playgroud)

这种情况下它是函子还是函数对象?

std::function<void(int, int)> f = [](int some, int some2) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

现在,在这种情况下,结果是什么?函子还是函数对象?

101*_*010 7

第一个f(即用 指定的auto)产生所谓的 lambda 函数。也称为闭包。闭包是未命名的函数对象。这就是为什么我们需要auto推断闭包的类型。我们不知道它的类型,但编译器知道。因此,通过使用,auto我们让编译器为我们推断出未命名闭包对象的类型。

第二个f(即用 指定的std::function)是一个std::function对象。类 std::function 是通用多态函数包装器。

作为函数对象的 Lambda 闭包可以转换为其各自的std::function对象。这正是正在发生的事情:

std::function<void(int, int)> f = [](int some, int some2) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

右侧的 lambda 闭包被赋值并转换为std::function赋值左侧的对象。

实际上,它们都被解释为函子,因为它们都重载调用operator(),因此可以被调用,除了 lambda 的类型是未命名的。

这两者之间的另一个区别是,您不能在 lambda 闭包之间进行赋值,因为对于 lambda 闭包,赋值运算符被声明为已删除。同时您可以在std::function对象之间分配。