当我在指向带有重载的 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()
的简写。换句话说,它是一种
- 解引用指针 --
*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.);
。
希望这对您有所帮助。
关于C++ 为什么 operator-> 会中断嵌套的 operator() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47843501/