C++仿函数使用带不带括号的原因

学习C++仿函数时,比如利用仿函数从大到小排序规则,在使用时加括号和不加括号的原因什么?如

#include <map>
#include<iostream>
#include<vector>
using namespace std;
#include<string>
#include <algorithm>

class MyCompare {
public:
    bool operator()(int v1, int v2) const {
        return v1 > v2;
    }
};

void test201()
{
    //默认从小到大排序
    //利用仿函数实现从大到小排序
    map<int, int, MyCompare> m;

    m.insert(make_pair(1, 20));
    m.insert(make_pair(2, 20));
    m.insert(make_pair(3, 30));
    m.insert(make_pair(4, 50));
    m.insert(make_pair(5, 10));

    for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
        cout << "key:" << it->first << " value:" << it->second << endl;
    }
}
class GreaterFive {
public:
    bool operator()(int val) {
        return val > 5;
    }
};
//找到大于5的数
void test_011() {

    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v2.push_back(i);
    }

    vector<int>::iterator it1 = find_if(v2.begin(), v2.end(), GreaterFive());
    if (it1 == v2.end()) {
        cout << "没找到!" << endl;
    }
    else {
        cout << "找到:" << *it1 << endl;
    }

}

这里find_if(v2.begin(), v2.end(), GreaterFive());的GreaterFive()和map<int, int, MyCompare>的MyCompare;
再比如用for_each遍历,采用普通函数为什么只需传函数名?

#include <algorithm>
#include <vector>
#include<iostream>
using namespace std;

//普通函数
void print01(int val)
{
    cout << val << " ";
}
//函数对象
class print02
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};

void test_01() {

    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    //遍历算法
    for_each(v.begin(), v.end(), print01);
    cout << endl;

    for_each(v.begin(), v.end(), print02());
    cout << endl;
}

int main() {

    test_01();

    system("pause");

    return 0;
}

希望大家解惑,谢谢

你这里的MyCompare是个类, 如果类不加括号, 可用于声明, 如
map<int, int, MyCompare> m; 这里int 和MyCompare都是类,
而类加括号, 意味着构造一个对象, 这个对象相当于一个函数也就是仿函数, 函数指针和lambda可以作为平替.
print01(5) 等同 print02()(5)

仿函数?你说的是函数指针吧
带括号表示调用
不带括号表示函数指针本身


vector<int>::iterator it1 = find_if(v2.begin(), v2.end(), GreaterFive()); //GreaterFive()代表一个临时的对象,find_if会对这个对象调用 operator() ,也就是所谓的仿函数,普通的函数会直接调用