代码之家  ›  专栏  ›  技术社区  ›  Varg Nord

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

  •  1
  • Varg Nord  · 技术社区  · 7 年前

    我使用自定义比较器 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 回复  |  直到 7 年前
        1
  •  2
  •   Some programmer dude    7 年前

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

    如果您使用 &comp 然后得到一个指向该对象的指针,该指针是不可调用的。


    你的λ基本上等于

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