Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我们需要添加&;在decltype(&;fun)中,fun是静态函数吗?_C++_Decltype - Fatal编程技术网

C++ 为什么我们需要添加&;在decltype(&;fun)中,fun是静态函数吗?

C++ 为什么我们需要添加&;在decltype(&;fun)中,fun是静态函数吗?,c++,decltype,C++,Decltype,源代码: 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); 静态布尔cmp(配对与m、配对与n){ 返回m.

源代码:

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);
静态布尔cmp(配对与m、配对与n){
返回m.second>n.second;
}
优先级队列q(cmp);
当fun是一个静态函数时,为什么需要添加decltype(&fun)?

decltype(cmp)
是一个函数类型

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


在许多上下文中,函数类型隐式地退化为函数指针类型,这会使我们忘记它们是不同的类型。这是差异相关的情况之一。您可以使用函数指针作为容器比较器-容器将在内部存储该指针的副本,并且在交换容器时它将被交换。您不能使用函数。

bool(pair&,pair&)
对于类成员来说不是有效的类型,但是
bool(*)(pair&,pair&)
是有效的类型。您也可以使用对函数的引用,使用
decltype((cmp))
@cigien我不这么认为。对函数的引用也无法交换。似乎对对象的引用是允许的(但我不确定这是否是故意的)。似乎至少是这样。“比较类型(如果存在)必须是可交换的”,除此之外,
Compare
FunctionObject
,顾名思义。所以这不是真正的交换。@Brian:要这样解释,您必须假设规范将在每个使用它的地方重新定义每个命名需求。这不是他们的工作方式。文本中对它们的使用经常涉及它们的定义(即使该定义在后面)。在一个地方说
Compare
与在另一个地方说
Compare
是一个不同的概念,就像说“expression”指的是一段不同的语法,只是因为它不在标准的[expr]部分中,而该部分中明确定义了该术语。