C ++为什么运营商 - >打破嵌套的operator()调用?

时间:2017-12-16 07:22:10

标签: c++ operator-overloading operators

当我在带有重载的opearator()(aka functors)的类的指针上使用dereference运算符时 - 它就像一个魅力:

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)

为什么?

1 个答案:

答案 0 :(得分:1)

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

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

它会编译好。相反,您可以使用等效(以及更常规)表示法来调用运算符,如下所示:

g(1,2.);

这很干净。你要做的是实现相同的干净的操作符调用,但是使用->符号从指针开始,认为同样的魔法将适用。可悲的是,它并没有这样的方式。在C ++中,p->a()(*p).a()的简写。换句话说,这是一种

的方式
  1. 取消引用指针 - *p;
  2. 中取消引用对象调用方法(或访问成员) - (*p).a();
  3. 该解除引用的对象不再是指针(*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.);

    希望这有帮助。