将函数的引用和 lambda 表达式作为参数传递时有什么区别?

What is the difference when passing function's reference and lambda expression as arguments?

本文关键字:参数传递 什么 区别 函数 引用 表达式 lambda      更新时间:2023-10-16

我正在使用priority_queue的自定义比较器,找到不同的行为。我已经知道STL容器需要特定类型传递到模板声明。使用普通功能时,应该是:

bool cmp(pair<int, int> &lhs, pair<int, int> &rhs) {
    return lhs.first > rhs.first;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> pq1(v.begin(), v.end(), cmp);

但是使用lambda时,我发现正确的方法是:

auto comp = [](const pair<int, int>& lhs, const pair<int, int>& rhs){return lhs.second < rhs.second;};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> pq2(v.begin(), v.end(), comp);

我提到了宣布,但没有发表意见。有人可以解释编译器如何处理decltype(&function)decltype(lambda)

那是因为lambda表达式创建 object (匿名类(。

如果您使用&comp,则获得对象的指针,该对象无法call。


您拥有的lambda基本上等同于

struct
{
    bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs)
    {
        return lhs.second < rhs.second;
    }
} comp;