为什么 operator() 有奇怪的行为?

Why strange behaviour with operator()?

我有简单的class,

class Func
{
public:
    Func()
    {
        cout<<"Constructor"<<endl;
    }

    int operator()(int)
    {
        cout<<"Operator ()";
        return 0;
    }
};
  1. 当我通过给圆括号 Func f(); 创建它的对象时,它什么都不打印,它应该打印 Constructor。但是当我创建不带括号的对象时,它会打印 Constructor 这是预期的。这两者有什么区别?
  2. 当我尝试使用 operator() f(2) 时出现编译错误。

error C2660: 'f' : function does not take 1 arguments

这不是奇怪的行为还是我遗漏了什么?

Func f();, it prints nothing, it should print Constructor

这根本不是真的。

创建 Func 的方法如下:

Func f;

When I try to use operator() f(2) it gives me compilation error. error C2660: 'f' : function does not take 1 arguments. Isn't it strange behaviour or I am missing something?

是的,这很奇怪,但并不意外。当您编写 Func f() 时,您声明了一个名为 f 的函数返回一个 Func。在那之后你尝试用 f 做的所有事情,自然地,都会被破坏。

这里有点意思。

Func f();

是一个函数的前向声明,它没有参数,return Func 类型对象。

检查下面的代码:

#include <iostream>
using namespace std;

class Func
{
public:
    int operator()(int)
    {
        return 0;
    }
};

int main ()
{
    Func f();
    f();
    return 0;
}

Func f ()
{
    cout << "My Func" << endl;
    Func * f = new Func;
    return *f;
}

它将在标准输出上输出 "My Func"。