我有一些使用 lambda 表达式的代码:
#include <vector>
#include <algorithm>
int main(){
std::vector<int> vi={3,1};
std::sort(vi.begin(),vi.end(),[](int x,int y){
return x<y;
});
return 0;
}
不需要#include< functional>
编译,但如果我使用变量来存储 lambda 函数:
#include <vector>
#include <algorithm>
#include <functional>
int main(){
std::vector<int> vi={3,1};
std::function<void()> compf=[](int x,int y){
return x<y;
};
std::sort(vi.begin(),vi.end(),compf);
return 0;
}
那么我需要包含<functional>
编译,为什么?为什么sort()
不包括 <functional>
已经?
最佳答案
因为 lambda 表达式是编译器提供的核心语言功能。 std::function
是一个库功能,在代码中实现。请注意,您无需包含任何内容即可将 lambda 存储在变量中。
auto f = [](int x, int y){ return x < y; };
您只需要包含<functional>
如果您打算将其存储在 std::function
(因为这就是它的实现方式)。
您似乎认为 lambda 的类型是 std::function
.它不是。每个 lambda 表达式都有自己独特的、不可命名的类型。我用 auto
捕获了上面的那个类型. std::function
是一种更通用的类型,可以存储 any 具有适当签名的类似函数的对象。例如,我可以创建一个 std::function<int(int,int)>
对象,并为其分配一个普通函数、一个函数对象和一个 lambda。
#include <functional>
int minus_func(int a, int b) { return a - b; }
struct plus_t {
int operator()(int a, int b) const { return a + b; }
};
int main() {
auto mult_lambda = [](int a, int b) { return a * b; };
std::function<int(int,int)> func;
func = minus_func;
func = plus_t{};
func = mult_lambda;
}
这种通用性也有代价,以动态分配和间接的形式。而通过其实际类型的变量使用 lambda 通常是内联的。
关于c++ - 为什么 lambda 表达式不需要 <functional>,而 function<void()> 需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39340630/