c++ - 为什么 lambda 表达式不需要 <functional>,而 function<void()> 需要?

标签 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>已经?

最佳答案

因为 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/

相关文章:

c++ - 显示集合的第一个元素

c++ - 在C++中的类中实现回调函数

c++ - Opencv:对于非标准尺寸的图像,imdecode() 失败

c++ - C++ 的标准映射插入语义的基本原理?

c++ - 棘手的回调实现(C++)

c# - 传递一个 *Awaitable* 匿名函数作为参数

android - QT Android 应用程序应该在 android 启动日志之后启动

python - 分解 OpenERP lambda

java - 我应该始终使用 Lambda 表达式进行异常测试吗?

c# - 需要帮助来逆转此 Lambda 操作的逻辑