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。换句话说,这是
的一种方式
- 取消引用指针 --
*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.);
.
希望这对您有所帮助。
当我在指向 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。换句话说,这是
- 取消引用指针 --
*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.);
.
希望这对您有所帮助。