当我在带有重载的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)
为什么?
答案 0 :(得分:1)
在C ++中,点(.
)运算符用于访问对象上的成员和调用方法。在您的示例中,您可以按以下方式使用:
g.operator()(1, 2.);
它会编译好。相反,您可以使用等效(以及更常规)表示法来调用运算符,如下所示:
g(1,2.);
这很干净。你要做的是实现相同的干净的操作符调用,但是使用->
符号从指针开始,认为同样的魔法将适用。可悲的是,它并没有这样的方式。在C ++中,p->a()
是(*p).a()
的简写。换句话说,这是一种
*p
; (*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.);
。
希望这有帮助。