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

标签 c++ operator-overloading operators

当我在指向带有重载的 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() 的简写。换句话说,它是一种

  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.);

希望这对您有所帮助。

关于C++ 为什么 operator-> 会中断嵌套的 operator() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47843501/

相关文章:

c++ - hash_map 是 STL 的一部分吗?

c++ - C和C++对内存的误解

python - 在 Python 中,说我们 "override"内置运算符的行为准确吗?

c++ - 为什么它不会进入无限循环

c++ - 在 Visual C++ 中将 std::string 添加到 uint 时出现模棱两可的错误

c++ - Template模板函数及参数推导

c++ - 如何将 C++ 字符串转换为大写

c++ - 如何重载具有多个参数的运算符,如 a + b + c?

C++ 运算符顺序评估

c++ - 返回 *this