首页 > 解决方案 > 当 fun 是静态函数时,为什么我们需要在 decltype(&fun) 中添加 &?

问题描述

源代码:

static bool cmp(pair<int, int>& m, pair<int, int>& n) {
    return m.second > n.second;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);

当 fun 是静态函数时,为什么我们需要在 decltype(&fun) 中添加 &?

标签: c++decltype

解决方案


decltype(cmp)是一个函数类型。

对于标准库容器,Compare类型(如果存在)必须是Swappable。功能不能交换,因此它们被排除在外。也就是说,当交换两个容器时,比较器类型会跟随对象本身进入它们的新容器。这对于函数类型是不可能的,因此可交换性要求隐含地禁止函数类型用作比较器。

在许多情况下,函数类型隐含地衰减为函数指针类型,这会让我们忘记它们是不同的类型。这是差异相关的情况之一。您可以将函数指针用作容器比较器 - 容器将在内部存储该指针的副本,并在交换容器时进行交换。你不能使用函数。


推荐阅读