我似乎无法绕过它。 ->
的{{1}}运算符只返回指向成员的指针(假设它是一个类的实例),但同时它可以用来调用方法......怎么样?我们没有对std::shared_ptr
运算符返回的指针做任何事情。我们如何调用方法和访问实例变量?如果我有一些功能相同的东西,比如
->
T* Get() {
return &t;
}
中的(是的,我确实知道有std::shared_ptr
方法),为什么我不能写:
get()
基本上就是
someSharedPtr.Get()SomeMethod()
正在做......我很困惑。如何返回指针代替someSharedPtr->SomeMethod()
或->->
语法?
答案 0 :(得分:13)
如何返回指针代替
->->
或operator->()->
语法?
因为标准是这样说的。
13.5.6 [over.ref]定义了一个重载的operator->
去做正确的事情:
如果
x->m
存在并且运算符被选为最佳运算符,则表达式(x.operator->())->m
将被解释为x
类T
类对象T::operator->()
通过重载解析机制匹配函数(13.3)。
如果没有这样做,那么你就无法实现类似于指针的类型,并且具有用户期望的类似指针类型的x->m
通常的语义。因此,语言说它就是它所做的,做其他任何事情都会使重载operator->
变得不那么有用。
这实际上允许你将operator->
的调用链接到任意深度,如果你有类似指针的类型,返回类似指针的类型,返回类似指针的类型等,直到最终返回一个真实的指针。