编译器如何处理函数函数中重载的函数调用操作符
How does the compiler handle overloaded function call operators in functors?
假设我定义、实例化和使用一个加法器函子,如下所示:
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
的实例化和"函数调用"期间使用哪个函数,以实现正确的行为?从表面上看,答案似乎是显而易见的,但我就是无法理解这个想法。
谢谢你的时间!
你的例子比较了重载operator()
的构造函数和成员函数。编译器知道何时调用哪一个。非常简单:
-
当要构造一个对象时,调用构造函数
-
在已经构造的对象上调用成员函数。在您的例子中,成员函数是
operator()
。
这意味着,它们在完全不同的上下文中被调用。没有歧义,没有混淆。
每次创建一个类的实例时,都会调用构造函数方法。编译器当然可以根据构造函数的名称来确定它。因此,它将首先被调用,operator ()
将是第二个
c++有一个语法,编译器将知道(总的简化)何时类型被实例化,因此在类的实例上调用重载操作符()
的情况下应该调用构造函数。
如何使用语法来确定这可能需要一门关于编译器的课程,而龙书可能是标准的。如果你很好奇,你也可以看看c++大师认证,它的目标是构建一个c++编译器。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载