我有一些代码使用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>
?
答案 0 :(得分:46)
因为lambda表达式是编译器提供的核心语言特性。 std::function
是一个库功能,以代码实现。请注意,您不需要包含任何内容来将lambda存储在变量中。
auto f = [](int x, int y){ return x < y; };
如果您打算将<functional>
计划存储在std::function
中,则只需要包含std::function
。
您似乎认为lambda的类型是auto
。它不是。每个lambda表达式都有自己唯一的,不可命名的类型。我使用std::function
捕获了上面的那种类型。 std::function<int(int,int)>
是一种更通用的类型,可以使用适当的签名存储任何类似函数的对象。例如,我可以创建一个#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。
#include
这种一般性的成本,动态分配和间接的形式。而使用lambda通过其实际类型的变量经常被内联。
答案 1 :(得分:6)
lambda函数是语言的一部分 - 独立于任何库。
另一方面, std::function
是标准库的一部分,在标准库头文件functional
中定义。
因此,使用
std::sort(vi.begin(),vi.end(),[](int x,int y){
return x<y;
});
使用时,不需要functional
为#include
d
std::function<void()> compf=[](int x,int y){
return x<y;
};
std::sort(vi.begin(),vi.end(),compf);
要求functional
为#include
d。