C++ 超载“-&燃气轮机&引用;(成员访问)递归地

C++ 超载“-&燃气轮机&引用;(成员访问)递归地,c++,C++,我正在学习如何重载“->”,文档中说: 运算符->在返回的值上再次被递归调用,直到到达返回普通指针的运算符->为止。此后,内置语义将应用于该指针 虽然很清楚文档中说的是什么,本质上,一个类的重载“->”可以使用一个“特殊指针”,它本身有一个重载“->”可以给出一个“特殊指针”等等,直到找到一个“普通指针”,但我找不到一个真正使用它的示例(除非它用于查找链接列表的最后一个元素) 有人能解释一下幕后的视网膜是什么(因为这种可能性没有“普通指针”——所以我看不出有任何理由提供“特殊指针”) 一个真实世

我正在学习如何重载“->”,文档中说: 运算符->在返回的值上再次被递归调用,直到到达返回普通指针的运算符->为止。此后,内置语义将应用于该指针

虽然很清楚文档中说的是什么,本质上,一个类的重载“->”可以使用一个“特殊指针”,它本身有一个重载“->”可以给出一个“特殊指针”等等,直到找到一个“普通指针”,但我找不到一个真正使用它的示例(除非它用于查找链接列表的最后一个元素)

有人能解释一下幕后的视网膜是什么(因为这种可能性没有“普通指针”——所以我看不出有任何理由提供“特殊指针”)

一个真实世界使用的例子也会有所帮助,因为我可能缺少一个应用行为的模型


另一方面,可能需要避免这种行为,怎么做?

嗯,
->
操作员在评级员特殊情况下工作

可以称之为伪二进制运算符。根据其自然语法
pointer->member
,它需要两个操作数:左侧是一个正常的运行时操作数,右侧是一个相当“奇怪”的成员名操作数。第二个操作数的“陌生性”是基于C++语言没有用于表示此类操作数的用户可访问概念的事实。语言中没有任何东西可以将成员名表示为操作数。无法通过代码将成员名“传递”给用户定义的实现。成员名称是编译时实体,与此类似的常数表达式,但C++中没有常数表达式可以指定成员。(有用于指向成员的指针的表达式,但不用于成员本身)

这在指定重载的
->
运算符的行为时造成了相当明显的困难:我们如何将
->
右侧指定的内容(即成员名称)连接到用户编写的代码?直接做这件事是不可能的。解决这种情况的唯一方法是间接执行:强制用户将重载的
->
操作符的用户定义功能导入到某些现有内置操作符的功能中。内置操作符可以通过其核心语言功能自然处理成员名称

在这种特殊情况下,我们只有两个候选对象可以将重载的
->
功能传递到:内置的
->
和内置的
。为该角色选择内置的
->
是合乎逻辑的。这产生了一个有趣的副作用:可以编写重载
->
运算符的“链式”(递归)序列(由编译器隐式展开)甚至无限递归序列(格式错误)

非正式地说,每次使用智能指针时,都会实际使用重载的
->
运算符的这些“递归”属性。如果您有一个智能指针
sptr
,该指针指向具有member
member
的类对象,则成员访问语法保持完全自然,例如
sptr->member
。您不必像
sptr->->member
sptr->.member那样做,因为重载的
->
具有隐含的“递归”属性

请注意,此递归行为仅在使用运算符语法调用重载的
->
运算符时应用,即
对象->成员
语法。但是,您也可以使用常规成员函数调用语法来调用重载的
->
,例如
object.operator->()
。在这种情况下,调用作为普通函数调用执行,不会发生
->
的递归应用程序。这是避免递归行为的唯一方法。如果您实现了重载的
->
运算符,其返回类型不支持进一步应用
->
运算符(例如,您可以定义一个重载的
->
,返回
int
),那么
object.operator->()
将是调用重载实现的唯一方法。任何试图使用
object->member
语法的尝试都将是格式错误的

我找不到一个实际使用它的例子(除非它用于查找最后一个元素的链表)

我想你误解了它的作用。它不用于取消对列表元素的引用并继续取消对下一个元素的引用。每次调用
operator->
都会返回一个不同的类型,关键是如果第二个类型也有
operator->
它将被调用,这可能会再次返回不同的类型。假设它像
x->->->->->i
not
x->next->next->next
,如果这样有帮助的话

一个真实世界使用的例子也会有所帮助,因为我可能缺少一个应用行为的模型

它对模式很有用

另一方面,可能需要避免这种行为,怎么做呢

显式调用操作员:

auto x = p.operator->();

请定义“Primple Posits”和“特殊指针”“PrimePosiple”是C++的“普通指针”。@ COFFANDECONDER,有指针类的东西不是“智能指针”,例如迭代器,或者从AlrasPauleSeReR返回的用户定义的指针类型,这是有用的链接的一个具体例子,如果这是你正在寻找的:为了避免这种行为,您有几种选择:返回一些不会使运算符过载或在一开始就不使用它的内容(例如,对于内置类型),“文档说明…”那将是哪种文档?有指向成员的指针