为什么在c++中写比较器时不加括号?

Why don't we add parenthesis when writing comparator in c++?

这是解释我的意思的代码。


static bool comparator(int a, int b) {
    if(a > b) return false;
    return true;
}

sort(arr.begin(), arr.end(), comparator); // why don't we write comparator()

Why don't we add parenthesis when writing comparator in c++?

因为我们没有传递调用该​​函数的结果,而是传递指向该函数的指针。特别是,名为 comparatorstd::sort 的第三个参数将 隐式衰减 指向该函数类型的指针 由于类型衰减。您可能已经熟悉内置数组的类型衰减,它也会自动衰减到指向其第一个元素的指针。 This(函数指针的自由函数)只是类型衰减的另一个实例。

如果我们要传递 comaparator() 那么我们将传递一个 bool 类型的值,这不是预期的。此外,由于 comparator 需要 2 个 int 参数,所以如果我们要写 comparator() 它将无效,因为我们没有向它传递任何参数。

就好像你写的:

//---------------------------v--------------->note the & operator used here which is optional
sort(arr.begin(), arr.end(), &comparator);   //this statement is equivalent to the statement that you have in your question 

以上修改后的语句等同于您的示例中的语句。这里唯一的语法差异是我们显式使用&来指示我们正在传递一个指向函数的指针名为 comparator.

如果你会写

sort(arr.begin(), arr.end(), comparator());

则表示必须对函数std::sortcomparator()的参数表达式求值。但是两个参数都没有提供给函数调用 comparator()。所以编译器会发出错误信息。

另一方面,如果你会写

sort(arr.begin(), arr.end(), comparator);

然后函数指示符 comparator 被隐式转换为指向函数的指针,函数 std::sort 自身将使用指针调用函数并向其提供两个参数。