我不明白 std::shared_ptr 的 -> 运算符

I Don't Understand The -> Operator For std::shared_ptr

本文关键字:gt 运算符 明白 std shared ptr      更新时间:2023-10-16

我似乎无法理解它。std::shared_ptr->运算符只返回一个指向成员的指针(假设它是一个类的实例),但同时它可以用来调用方法。。。如何?我们不对->运算符返回的指针执行任何操作。我们如何调用方法和访问实例变量?如果我有功能等效的东西,比如

T* Get() {
return &t;
}

std::shared_ptr中(是的,我确实意识到有一个get()方法),为什么我不能写:

someSharedPtr.Get()SomeMethod()

这基本上就是

someSharedPtr->SomeMethod()

正在做。。。我很困惑。返回指针如何替代->->operator->()->语法?

返回指针如何替代->->operator->()->语法?

因为标准是这么说的。

13.5.6[over.ref]定义了一个过载的operator->来做正确的事情:

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

如果没有这样做,那么您就无法实现类似指针的类型,并且具有用户期望的类似指针的x->m的常见语义。因此,该语言说这就是它所做的,做任何其他事情都会使重载operator->变得不那么有用。

这实际上允许您将对operator->的调用链接到任意深度,如果您有一个类似指针的类型,该类型返回一个类似于指针的类型等,直到最终有东西返回一个真正的指针。