lambda和std :: function之间的区别是什么?

时间:2015-12-15 00:01:40

标签: c++11 functional-programming functor

在此示例中:

auto f = [](int some, int some2){
   //do something
};

这种情况下它是函数的函子或对象吗?

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

分配右侧的lambda闭包并将其转换为作业左侧的std::function对象。

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

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