You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++重载箭头运算符疑问:自定义智能指针单->即可调用成员的原因

C++重载operator->的语法规则说明

这是C++标准针对operator->重载的特殊隐式规则,属于为了对齐原生指针使用体验设计的语法糖,逻辑如下:

  • 当你对类对象调用->运算符时,编译器会先调用该类重载的operator->成员函数
  • 如果operator->的返回值是原生指针类型,编译器会自动在该返回指针上追加一次原生->调用,不需要你手动写第二个->
  • 如果operator->返回的是另一个重载了operator->的类对象,编译器会递归重复上述过程,直到最终得到一个原生指针,再执行原生->的调用逻辑

对你的示例代码来说:
你写的p->whoami();,编译器会自动展开为你推测的p.operator->()->whoami();,整个过程是隐式完成的,不需要手动写两次->。
这么设计的核心目的是让智能指针、指针包装类的使用体验和原生指针完全一致,替换原生指针时不需要修改原有调用代码,符合使用直觉。

举个递归调用的示例更容易理解:

// 第二层包装类
class SecondWrapper {
private:
    ScopePointer inner;
public:
    SecondWrapper(Entity* e) : inner(e) {}
    ScopePointer operator->() { return inner; }
};

int main() {
    SecondWrapper w(new Entity());
    // 只需要写一个->,编译器自动展开为 w.operator->().operator->()->whoami();
    w->whoami();
    return 0;
}

上述代码也可以正常运行,就是因为递归触发了operator->的隐式追加规则。


内容的提问来源于stack exchange,提问作者C.C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:45:00