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
相关产品推荐
相关产品推荐

