为什么在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++?
因为我们没有传递调用该函数的结果,而是传递指向该函数的指针。特别是,名为 comparator
到 std::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::sort
comparator()
的参数表达式求值。但是两个参数都没有提供给函数调用 comparator()
。所以编译器会发出错误信息。
另一方面,如果你会写
sort(arr.begin(), arr.end(), comparator);
然后函数指示符 comparator
被隐式转换为指向函数的指针,函数 std::sort
自身将使用指针调用函数并向其提供两个参数。
这是解释我的意思的代码。
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++?
因为我们没有传递调用该函数的结果,而是传递指向该函数的指针。特别是,名为 comparator
到 std::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::sort
comparator()
的参数表达式求值。但是两个参数都没有提供给函数调用 comparator()
。所以编译器会发出错误信息。
另一方面,如果你会写
sort(arr.begin(), arr.end(), comparator);
然后函数指示符 comparator
被隐式转换为指向函数的指针,函数 std::sort
自身将使用指针调用函数并向其提供两个参数。