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

问题描述 投票:1回答:1

当我在带有重载operator()(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)

这是为什么?

c++ operator-overloading operators
1个回答
1
投票

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

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

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

g(1,2.);

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

  1. 取消引用指针 - *p;
  2. 从该解除引用的对象调用方法(或访问成员) - (*p).a();

该解除引用的对象不再是指针(qazxsw poi周围的括号实现了这一点),这就是可以调用点运算符的原因。所以当你写:

*p

你在写什么是这样的:

f->(1,2.f);

这是无效的C ++,因为(*f).(1, 2.f); 不代表(*f)对象的地址。注意:

Functor

是有效的,因为它意味着:

f->operator()(1,2.f);

哪个有效。它相当于我上面写的第一行:(*f).operator()(1, 2.f);

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.