lambda 和 std::function 有什么区别?
What's the difference between lambda and std::function?
在此示例中:
auto f = [](int some, int some2){
//do something
};
这种情况是函子还是函数的对象?
std::function<void(int, int)> f = [](int some, int some2) {
//do something
}
现在,在这种情况下,结果是什么?函子或函数对象?
第一个 f
(即用 auto
指定的那个)产生所谓的 lambda 函数。也称为闭包。闭包是未命名的函数对象。这就是为什么我们需要 auto
来推断闭包的类型。我们不知道它的类型,但编译器知道。因此,通过使用 auto
我们让编译器为我们推断未命名闭包对象的类型。
第二个 f
(即用 std::function
指定的那个)是一个 std::function
对象。 Class 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
个对象之间分配。
在此示例中:
auto f = [](int some, int some2){
//do something
};
这种情况是函子还是函数的对象?
std::function<void(int, int)> f = [](int some, int some2) {
//do something
}
现在,在这种情况下,结果是什么?函子或函数对象?
第一个 f
(即用 auto
指定的那个)产生所谓的 lambda 函数。也称为闭包。闭包是未命名的函数对象。这就是为什么我们需要 auto
来推断闭包的类型。我们不知道它的类型,但编译器知道。因此,通过使用 auto
我们让编译器为我们推断未命名闭包对象的类型。
第二个 f
(即用 std::function
指定的那个)是一个 std::function
对象。 Class 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
个对象之间分配。