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

标签 c++ c++11 methods operators operator-overloading

我似乎无法理解它。 std::shared_ptr-> 运算符,只返回指向成员的指针(假设它是一个类的实例),但同时它可以用于调用方法...如何?我们没有对 -> 运算符返回的指针做任何事情。我们如何调用方法和访问实例变量?如果我有一些功能相同的东西,比如

T* Get() {
    return &t;
}

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

someSharedPtr.Get()SomeMethod()

本质上就是这样

someSharedPtr->SomeMethod()

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

最佳答案

How can returning a pointer substitute for something like ->-> or operator->()-> syntax?

因为标准是这么说的。

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

An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if T::operator->() exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3).

如果它没有这样做,那么您就无法实现像指针一样的类型,也无法实现用户期望的 x->m 的常用语义类似指针的类型。所以该语言说这就是它的作用,做任何其他事情都会使重载 operator-> 的用处大大降低。

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

关于c++ - 我不明白 std::shared_ptr 的 -> 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411098/

相关文章:

templates - C++ std::function-like模板语法

c++ - std::move() 作为性能瓶颈?

objective-c - 使用动态库的 Objective C 方法 Swizzling

c++ - OpenCV计算时间检测特征

c++ - 如果 `n`是 `2019`的倍数并且不在 `(a, b)`间隔中,则找到一个逻辑表达式,该表达式为true

c++ - C++ 基于范围的循环在内部是如何工作的

java - java包中的多个main方法

java - 如何在主方法中获取在不同方法中设置的私有(private)变量?

C++20:自动生成的运算符在派生类中不可引用?

C++ 运算符 []