C++ 编译器如何处理函子中的重载函数调用运算符?

C++ 编译器如何处理函子中的重载函数调用运算符?,c++,function,constructor,call,overloading,C++,Function,Constructor,Call,Overloading,假设我定义、实例化并使用加法器函子,如下所示: class SomeAdder { public: SomeAdder(int init_x): x(init_x) {} void operator()(int num) { cout << x + num <<endl; } private: int x; }; SomeAdder a = SomeAdder (3); a(5); //Prints 8

假设我定义、实例化并使用加法器函子,如下所示:

class SomeAdder {
    public:
        SomeAdder(int init_x): x(init_x) {}
        void operator()(int num) { cout << x + num <<endl; }
    private:
        int x;
};

SomeAdder a = SomeAdder (3);
a(5); //Prints 8

SomeAdder b(5);
b(5); //Prints 10
类加法器{ 公众: SomeAdder(int init_x):x(init_x){
void operator()(int num){cout每次创建类的实例时,都会调用构造函数方法。编译器肯定可以根据构造函数的名称来确定构造函数。因此,它将首先被调用,
操作符()
将其次被调用。

您的示例比较了重载
操作符()的构造函数和成员函数
。编译器知道调用哪一个以及何时调用。这非常简单:

  • 当要构造对象时,将调用构造函数

  • 成员函数是在已构造的对象上调用的。在您的示例中,成员函数是
    operator()

这意味着,它们是在完全不同的上下文中调用的。没有歧义,也没有混淆。

C++有一个简单的定义,编译器将从中知道(总体简化)何时实例化类型,因此应该从重载运算符
()正在类的实例上调用


语法是如何确定的,这可能需要一个编译器,它可能是标准。如果你好奇,你也可以检查出它的目标是建立一个C++编译器。

同样的方式,它区分了代码> f(x)< /> >从代码> g(x) >代码>空格f(int);无效g(int);-)如果编译器看到
SomeAdder(…)
,那么如果
SomeAdder
是一种类型,它怎么会认为这是对
操作符的调用呢。