"(成员访问)-6ren"> "(成员访问)-我正在学习如何重载“->”并且文档说:“operator-> 在它返回的值上被再次调用,递归地,直到到达 operator-> 返回一个普通指针。之后,内置语义应用于该指针。” 虽然文档说的很清楚,但-6ren">
gpt4 book ai didi

c++ - 递归重载 "->"(成员访问)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:52 24 4
gpt4 key购买 nike

我正在学习如何重载“->”并且文档说:“operator-> 在它返回的值上被再次调用,递归地,直到到达 operator-> 返回一个普通指针。之后,内置语义应用于该指针。”

虽然文档说的很清楚,但本质上,一个类的重载“->”本身可以使用一个“特殊指针”,它本身有一个重载的“->”,可以提供一个“特殊指针”等等,直到找到了一个“普通指针”,我找不到实际使用它的示例(除非它用于查找链表的最后一个元素)。

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

现实世界使用的示例也可能有所帮助,因为我可能缺少应用行为的模型。

另一方面,可能需要避免这种行为,如何做到?

最佳答案

嗯,->运算符(operator)在评价者的特殊情况下工作。

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

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

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

通俗地说,每次使用智能指针时,您都会在现实世界中使用重载 -> 的这些“递归”属性。运算符(operator)。如果你有智能指针sptr指向成员为 member 的类对象,成员访问语法保持完全自然,例如sptr->member .你不必像sptr->->member那样做或 sptr->.member特别是因为重载的隐式“递归”属性 -> .

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

关于c++ - 递归重载 "->"(成员访问),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25572595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com