为什么lambda表达式不需要<functional>,但函数<void()>呢?

时间:2016-09-06 04:23:21

标签: c++ lambda

我有一些代码使用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>

2 个答案:

答案 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。