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

时间:2018-02-20 09:30:30

标签: c++ c++11 stl

我正在使用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,但没有提出意见。有人可以解释编译器如何处理decltype(&function)decltype(lambda)

1 个答案:

答案 0 :(得分:2)

那是因为lambda expressions创建了对象(匿名类)。

如果使用&comp,则会得到一个指向该对象的指针,该指针不可调用。

你拥有的lambda基本上相当于

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