运算符() 重载和函数对象中的 c'tor 歧义

operator() overload and c'tor ambiguity in function objects

本文关键字:歧义 tor 重载 对象 函数 运算符      更新时间:2023-10-16

假设我们有下一个函数对象:

class foo{
private:
    int counter;
public:
    foo(int counter): counter(counter){}
    foo& operator=(const foo& ){...}
    bool operator() (int variable){....}
}
int main(){
    foo f(4);
    foo x(5);
    x = f(4);
    return 0;
 }

编译器如何知道如何响应:x = f(5)吗?我已经在网上和Stack上搜索了一段时间,还没有找到确切的答案,如果是转发,告诉我,我会删除这个问题。

这取决于"(5)"是用来构造一个对象还是在一个已经存在的对象上调用:

foo f(5); // calls the constructor
f(5);     // calls operator()

我添加了一个叫做eval的简单方法来解释它:

class foo {
private:
    int counter;
public:
    foo(int counter): counter(counter) {}
    bool operator() (int variable) {
        return variable < counter;
    }
    bool eval(int variable) {
        return variable < counter;
    }
};
  • foo是类而不是方法。
  • foo的实例可以像方法一样使用。
  • 调用foo(5)将创建一个foo的实例,其中counter = 5 .

  • evalfoo的成员函数。(现在它的作用与()操作符相同)

你可以这样调用eval:

foo f = foo(5); // create an instance of `foo`
f.eval(3); // returns true    ->   3 < 5
f.eval(0); // returns false   ->   6 < 5

也可以使用()运算符:

foo f = foo(5); // create an instance of `foo`
f(3); // returns true    ->   3 < 5
f(0); // returns false   ->   6 < 5

注意:

你也可以这样写(但不要这样做):

foo f = foo(5); // create an instance of `foo`
f.operator()(3); // returns true    ->   3 < 5
f.operator()(0); // returns false   ->   6 < 5