为什么嵌套函数的想法没有在旧的 C++ 标准中实现?

2023-12-05

在开发旧的 C++ 标准期间,嵌套函数的想法被认为是无用的,因为它的用法基本上被另一个概念(如面向对象编程)所涵盖;还是只是为了简化而实施?


嵌套函数 - 有用 - 需要包含函数的堆栈帧作为上下文。看这个:

class Foo()
{
   void Tripulate()
   {
       int i=0; 

       void Dip()
       {
           // ...
       }

       int x = 12;
       for(i=1; i<=3; ++i)
       {
          int z= 33;
          Dip();
          // ...
       }
   }
}

Dip() 应该访问哪些值?

没有任何?您刚刚或多或少地复制了(匿名)名称空间的功能。
只针对 i,因为它是函数之前唯一定义的一个?
仅限于 i 和 x,因为它们与Dip()?编译器是否必须确保构造函数x已经跑了,还是你的工作?
那么z呢?

如果 Dip 可以访问两个本地值tripulate和堆栈帧,所以内部原型是

   void Dip(Foo * this, __auto_struct_Dip * stackContext)
   {
       // ...
   }

您基本上已经复制了结构/类和成员函数的功能,但是在两个不兼容且不可交换的路径上。对于一个值得怀疑的收益来说,这是一个很大的复杂性。

我曾多次希望使用本地函数,只是因为这可以更好地指示需要的范围。但对于所有的问题...还有更多有用的东西可以让 C++ 变得更加复杂。

[编辑] 使用 C++0x,lambda 可以做到这一点,允许显式地声明它们捕获的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么嵌套函数的想法没有在旧的 C++ 标准中实现? 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 什么是异地退货?

    什么是非本地退货 什么场景下有用 请举个例子来解释一下 这是一篇好文章 http yehudakatz com 2010 02 07 the building blocks of ruby 关于在 ruby 块的上下文中使用非本地返回 Ru
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 禁用 RecyclerView 的某些项目的点击/触摸

    有没有办法防止点击回收器视图的特定项目 已经尝试将视图设置为不可点击且未在视图持有者构造函数中启用 但仍然没有成功 当我触摸该项目布局内的编辑文本时 它仍然可以单击并且会打开键盘 首先十分感谢 编辑 这与引用主题中提出的问题不是同一个问题
  • Apache httpd basic auth 绕过带有 html/jsp 页面的弹出窗口

    我想替换 Apache 的 httpd 基本身份验证 基于弹出窗口 与正常的基于表格的登录页面 可以这样做吗 我找到了答案 希望它可以帮助某人 Apache httpd 服务器内部支持mod auth form 使用它 我们可以通过显示基于
  • 使用 C# 以编程方式获取最后填充的 Excel 行

    我正在尝试使用 Microsoft interop Excel 库和 C 以编程方式获取 Excel 工作表的最后一行 我想这样做 因为我负责循环遍历 Excel 电子表格的所有记录并对它们执行某种操作 具体来说 我需要最后一行的实际数字
  • 使用 C# 计算 Zip 文件中的文件数量

    我正在生成一些 csv 文件 我需要将其压缩到 Zip 文件中 好吧 我有一个框架可以做到这一点 可能一切都会好起来的 但 正如 TDD 所说 在进行一些测试之后 我就可以编写代码了 我的第一个测试听起来很简单 但我在读取 Zip 文件时遇
  • 如何在 docker-compose 中将绝对主机路径挂载为命名卷?

    我已经尝试过解决方案这个堆栈溢出线程 它对我不起作用 如下所示 这是我的docker compose yml file version 3 7 services db image mysql volumes data var lib mys
  • 无法从 Qlinedit 获取 20 字节十六进制输入并将其存储到 Qstring 中

    我想从以下位置获取 20 字节十六进制输入QlinEdit我想验证QlinEdit仅 20 个字节并将其存储到QString 我已经完成了试用目的 ui gt SetValue gt setMaxLength 4 ui gt SetValu
  • 使用prepareForSegue传递UIWebView请求

    我是 IOS 和 Objective C 的新手 场景是我有 2 个按钮 它们打开 使用 segue 2 个包含 UIWebview 的视图控制器 我认为最好使用 1 个 UIWebView 来完成此操作 因此我尝试传递 webvew 的请
  • 将可选的 @State 传递给非可选的 @Binding 视图变量

    我正在尝试通过可选 State在视图中不可选 Binding在那里编辑它 我遇到了 Xcode 所困扰的问题Fatal error Unexpectedly found nil while unwrapping an Optional va
  • 按输入值创建深度过滤器

    我有一个对象数组 id 95c3 1e74 48c7 ec7e name model yaml type file path model model yaml id 115c d112 5ce5 a7e8 name storage comp
  • Pyinstaller 和 wx.lib.pubsub 的导入问题

    我的 Python GUI 应用程序运行完美 但是当我尝试创建可执行文件时 我尝试使用 pyinstaller 3 3 dev0 483c819 命令 pyinstaller gui app py 我收到以下问题 7699 INFO Loa
  • 从 WCF 中的 HTTP 响应中删除服务器

    我有一个在 IIS 7 5 上运行的暴露于互联网的 WCF 服务 我需要保护它的安全 我想删除 HTTP 响应中的 Server 标头 我已经实现了 IDispatchMessageInspector 代码如下 public void Be
  • R在conda环境下加载igraph失败

    我正在尝试在 Windows 上的 Ubuntu WSL2 安装中运行 RShiny 应用程序 我不是 R 方面的专家 但我觉得这是由于 conda 与 R 交互造成的问题 我运行以下命令 conda create n r env r es
  • 取消单次重复本地通知

    我已安排在上午 10 点重复本地通知 重复间隔为一周 是否可以通过编程方式仅取消一次重复通知 例如 现在是上午 9 30 用户点击了复选框并 以编程方式 取消了通知 因此它不会在 10 00 显示 但会在下周显示 这不可能取消重复本地通知的
  • 如何访问模型中的current_user对象?

    我正在尝试在我的 团队 模型中编写一个方法 但 current user 显示此错误 未定义的局部变量或方法 current user def set default url if current user id self user id
  • 是否可以在存储库外部存储 Codeception 的功能/接受配置 URL?

    我有一个使用 Codeception 的 PHP 项目 有几个开发人员正在开发该项目 每个人都有自己的环境和不同的项目副本 URL 但在 Codeception 功能 接受 yml 配置文件中 我们必须设置用于接受和功能测试的 URL 我们
  • 来自字节数组的 NSImage

    我正在尝试在 NSImageView 中显示图像 图像包含在字节数组中 我怎样才能做到这一点 据我了解 我需要将 byte 转换为 NSData 变量并将其提供给 NSImage 它是否正确 我该怎么做 我尝试过强制转换 但不起作用 而且似
  • 检查列表中的所有项目是否相同

    我有一个 日期时间 项目列表 如何使用 LINQ 查询检查所有项目是否相同 在任何给定时间 列表中可能有 1 2 20 50 或 100 个项目 像这样 if list Distinct Skip 1 Any Or if list Any
  • 如何在 Django 中查询一天中特定时间之前创建的对象?

    在 Django 中 我试图将查询过滤为仅在一天中特定时间之前创建的对象 我有一个名为 created at 的日期时间字段 它存储创建该对象的日期时间 我想做的是 query query filter created at hour lt
  • 在 JavaScript 中将日期字符串解析为日期

    我有这个日期字符串 2013 05 12 11 41 31 我试过 var strDate 2013 05 12 11 41 31 var dateParts strDate split var date new Date datePart
  • 为什么嵌套函数的想法没有在旧的 C++ 标准中实现?

    在开发旧的 C 标准期间 嵌套函数的想法被认为是无用的 因为它的用法基本上被另一个概念 如面向对象编程 所涵盖 还是只是为了简化而实施 嵌套函数 有用 需要包含函数的堆栈帧作为上下文 看这个 class Foo void Tripulate