C++ 为什么 operator-> 会中断嵌套的 operator() 调用?

C++ Why the operator-> breaks the nested operator() call?

当我在指向 class 的指针上使用解引用运算符并重载 opearator()(又名仿函数)时 - 它的工作原理非常棒:

struct Functor {
    int operator()(int a, float b) {
        return a+b;
    }
};

Functor g;
Functor * f = &g;
g(1,2.);
(*f)(1,.2);
f->operator()(1,2.f);

但是表格

// f->(1,2.f); // doesn't compile (expected unqualified-id)

这是为什么?

在 C++ 中,点 (.) 运算符用于访问对象的成员和调用方法。在您的示例中,您可以按以下方式使用:

g.operator()(1, 2.);

它会编译得很好。相反,您以 等效 (和更传统的)表示法调用运算符,如下所示:

g(1,2.);

漂亮干净。您正在尝试做的是实现相同的干净运算符调用,但是从指针开始,使用 -> 表示法,认为同样的魔法将适用。可悲的是,它不是那样工作的。在 C++ 中,p->a()(*p).a() 的 shorthand。换句话说,这是

的一种方式
  1. 取消引用指针 -- *p;
  2. 取消引用的对象调用一个方法(或访问一个成员)--(*p).a()

取消引用的对象不再是指针(*p 周围的括号实现了这一点),这就是可以调用点运算符的原因。所以当你写:

f->(1,2.f);

你写的是这样的:

(*f).(1, 2.f);

这是无效的 C++,因为 (*f) 不代表 Functor 对象的地址。注意:

f->operator()(1,2.f);

是有效的,因为它意味着:

(*f).operator()(1, 2.f);

有效。相当于我上面写的第一行:g.operator()(1, 2.);.

希望这对您有所帮助。