C++ 中运算符重载的困惑

C.C*_*C.C 1 c++ pointers class operator-overloading

我定义了一个类来包装原始指针,因此该指针可以自动删除。这是我的代码

#include <iostream>
class Entity
{
private:
    std::string e_name;
public:
    Entity():e_name("unknown"){}
    void whoami() {
        std::cout << e_name;
    }
};
class ScopePointer
{
private:
    Entity *_e;
public:
    ScopePointer(Entity *e) : _e(e) {}
    ~ScopePointer() { delete _e; }
    Entity *operator->() { return _e; }
};

int main(int argc, char *argv[])
{
    ScopePointer p(new Entity());
    p->whoami();
}
Run Code Online (Sandbox Code Playgroud)

它运作良好,但我完全不明白如何p->whoami();运作。我的意思是 ScopePointer 中的运算符 -> 重载应该像下面这样工作

p.operator->()->whoami();or p->->whoami();
Run Code Online (Sandbox Code Playgroud)

第一个->应该返回 Entity* ,下一个应该->返回类方法。为什么只有一个 -> 可以使其工作?

Vla*_*cow 6

我希望 C++ 14 标准中的这段引用将有助于理解该运算符的工作原理。

C++ 14 标准(13.5.6 类成员访问,p #1)

如果 T::operator->() 存在并且该运算符被选为最佳匹配函数,则对于类型为 T 的类对象 x,表达式 x->m 被解释为 (x.operator->())->m通过重载决议机制。

所以重载运算符实际上是内置运算符->的“前缀表达式”,它提供了内置运算符中使用的指针。