运算符的递归应用->

2023-11-23

据说箭头运算符是递归应用的。但是当我尝试执行以下代码时,它在应该打印 4 的情况下却打印出乱码。

class dummy
{
public:
    int *p;

    int operator->()
    {
        return 4;
    }
};

class screen 
{
public:
    dummy *p;

    screen(dummy *pp): p(pp){}
    dummy* operator->()
    {
        return p;
    }
};

int main()
{
    dummy *d = new dummy;
    screen s(d);
    cout<<s->p;
    delete d;
}

Stanley 所说的“递归”只是将运算符应用于每个返回的对象until返回的类型是指针。

第一次尝试时会发生这种情况:screen::operator ->返回一个指针。因此,这是对operator ->编译器尝试的。然后它解析运算符的右侧 (p)通过在返回的指针类型中查找成员(dummy)用这个名字。

本质上,每当编译器发现语法aᵢ->b在代码中,它本质上应用了以下算法:

  1. Is aᵢ指针类型?如果是这样,请解决成员b of *aᵢ并打电话(*aᵢ).b.
  2. Else, try to resolve aᵢ::operator ->
    1. 成功后,设置aᵢ₊₁ = aᵢ::operator ->()。转到1。
    2. 失败时,发出编译错误。

我很难想出一个简短而有意义的例子来说明chain of operator ->调用甚至是有意义的。也许唯一真正的用途是当您编写智能指针类时。

但是,下面的玩具示例至少可以编译并生成一个数字。但我不建议实际编写这样的代码。它会破坏封装并使小猫哭泣。

#include <iostream>

struct size {
    int width;
    int height;
    size() : width(640), height(480) { }
};

struct metrics {
    size s;
    size const* operator ->() const {
        return &s;
    }
};

struct screen {
    metrics m;
    metrics operator ->() const {
        return m;
    }
};

int main() {
    screen s;
    std::cout << s->width << "\n";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运算符的递归应用-> 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 按成员序列化

    我已经实现了template
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 将 RGB 颜色值转换为十进制

    如何将 RGB 颜色值转换为纯十进制 所以我有 RGB 255 255 255 是白色其十进制等效值为 16777215 我试过认为这可能只是 var dec r g b but this doesn t work 虽然那不起作用 有人知道
  • 使用实时数据创建闪亮的应用程序

    我正在尝试创建一个闪亮的应用程序来显示实时收集的数据 为此我正在使用invalidateLater 5000 session 定期更新 R 中的数据 这是我的轮廓server R file library shiny library mag
  • 如何使用 BASIC 身份验证从网站注销用户?

    如果用户使用基本身份验证 是否可以从网站注销用户 杀死会话是不够的 因为一旦用户通过身份验证 每个请求都包含登录信息 因此用户下次使用相同的凭据访问站点时会自动登录 到目前为止唯一的解决方案是关闭浏览器 但从可用性的角度来看这是不可接受的
  • 如何让 VBO 使用 Python 和 PyOpenGL

    以下 Python 程序应在窗口的右上象限绘制一个白色三角形 import pygame from OpenGL GL import from ctypes import pygame init screen pygame display
  • Ebnf – 这是 LL(1) 语法吗?

    我发现了以下内容EBNF在维基百科上 描述了 EBNF letter A B C D E F G H I J K L M N O P Q R S T U V W X Y Z digit 0 1 2 3 4 5 6 7 8 9 symbol
  • Java - 旋转数组

    所以目标是向右旋转数组中的元素a次 举个例子 如果a 2 然后array 0 1 2 3 4 会成为array 3 4 0 1 2 这是我所拥有的 for int x 0 x lt array length 1 x array x a ar
  • Java 打印包含整数的字符串

    我有一个疑问 public static void main String args throws IOException int number 1 System out println M number 1 Output M11 但我想把
  • 从 Rails 外部的 HAML 内部渲染 HAML 部分

    我正在使用 HAML 为网站生成一些静态 html 页面 并且我想将公共组件拆分为可以包含在多个页面中的部分 就像在 Rails 中一样 然而 我不想使用整个 Rails 堆栈来执行此操作 因为这看起来有些过头了 我在互联网上环顾四周 但没
  • java中的equals()和运算符“==”

    我知道equals 将比较对象的值 运算符将检查变量是否指向同一内存 我不明白怎么办equals 比较对象的值 例如 class Test public Test int x float y this x x this y y int x
  • 有时,在乒乓球比赛中球不会从球拍上弹起

    我有一个简单的乒乓球游戏 大部分效果都很好 但有时会出现球不弹起球拍的情况 球沿着桨叶摆动和滑动 桨叶似乎用磁力拉动球 如动画所示 每次当球周围的矩形碰撞桨矩形时 球的方向就会改变 if ball colliderect paddleLef
  • 如何从 Python 中的任何应用程序捕获剪贴板事件(相当于 onChangeClipboard)

    我正在研究剪贴板管理器 我当前的问题是成功捕获任何应用程序对剪贴板的修改 例如 从 ctrl c 右键单击并复制到剪贴板 这个想法是Python脚本在后台运行 就像一个恶魔一样 捕捉剪贴板的每一个变化 万分感谢 附 对于了解 autohot
  • SQL grant 在多个对象上执行

    大家好 我想为用户添加多个对象的执行权限 但我似乎无法在代码中添加通配符 GRANT EXECUTE ON OBJECT dbo CREATESERVERSESSIONS TO domain user 这可行 但我有很多以 XU 开头的存储
  • CosmosDB 按值将结果排序到数组中

    我有一些如下所示的 CosmosDB 文档 ProductId 1 Status true Code 123456 IsRecall false ScanLog Location type Point coordinates 13 5957
  • 无法打开登录请求的数据库。登录失败。用户登录失败

    我从我的一台计算机复制了一个数据库并在这里使用它 在尝试打开需要从数据库获取内容的页面时 在 con open 上我收到此异常 无法打开物理文件 E Program Files Microsoft SQL Server MSSQL10 SQ
  • ImportError:DLL 加载失败:动态链接库 (DLL) 初始化例程失败

    我在 Conda 环境中使用 CUDA Toolkit v9 0 和 cuDNNv7 1 以及 Python 3 6 安装了具有 CPU 支持的 TensorFlow 我按照 TensorFlow 网站中描述的说明进行操作 当我尝试时 im
  • 使用异步 chrome.storage 时如何重构全局变量?

    要在迁移到 MV2 事件页面或 MV3 Service Worker 时删除持久 MV2 后台脚本中使用的全局变量 我找到的所有指南都只给出了一个示例 用几行设置替换单个全局变量 然后开始使用chrome storage 但我仍然不清楚如何
  • 使用fragmentStatePagerAdapter更新viewpager中的片段/视图

    需要一些帮助来解决我在使用 viewpager 时更新页面的问题 我正在使用带有 FragmentStatePagerAdapter 的简单视图分页器 我想要做的就是访问当前片段 视图 以便我可以更新片段 视图中的一些文本视图 我在论坛里搜
  • 将 Interlocked.CompareExchange 与类一起使用

    System Threading Interlocked CompareExchange运算符提供比较和交换操作的原子 因此线程安全 C 实现 例如int i 5 Interlocked CompareExchange ref i 10 5
  • 当期望服务器端一次性响应时,长轮询与 websocket

    我读过很多关于实时推送通知的文章 总结一下 只要您不关心 100 的浏览器兼容性 websocket 通常是首选技术 但是 一篇文章指出 长轮询 可能当您与以下对象交换单个呼叫时 服务器 服务器正在后台做一些工作 这正是我的情况 用户按下一
  • 运算符的递归应用->

    据说箭头运算符是递归应用的 但是当我尝试执行以下代码时 它在应该打印 4 的情况下却打印出乱码 class dummy public int p int operator gt return 4 class screen public du