我应该复制 std::function 还是可以始终引用它?

2024-05-02

在我的 C++ 应用程序(使用 Visual Studio 2010)中,我需要存储 std::function,如下所示:

class MyClass
   {
   public:
      typedef std::function<int(int)> MyFunction;
      MyClass (Myfunction &myFunction);
   private:
      MyFunction m_myFunction;    // Should I use this one?
      MyFunction &m_myFunction;   // Or should I use this one?
   };

如您所见,我在构造函数中添加了函数参数作为引用。

但是,在我的类中存储该函数的最佳方式是什么?

  • 由于 std::function 只是一个函数指针并且该函数的“可执行代码”保证保留在内存中,因此我可以将该函数存储为引用吗?
  • 如果传递 lambda 并且调用者返回,我是否必须复制一份?

我的直觉告诉我,存储引用(甚至是常量引用)是安全的。我希望编译器在编译时生成 lambda 代码,并在应用程序运行时将此可执行代码保留在“虚拟”内存中。因此,可执行代码永远不会被“删除”,我可以安全地存储对它的引用。但这真的是真的吗?


由于 std::function 只是一个函数指针并且该函数的“可执行代码”保证保留在内存中,因此我可以将该函数存储为引用吗?

std::function不仅仅是一个函数指针。它是任意可调用对象的包装器,并管理用于存储该对象的内存。与任何其他类型一样,存储引用是安全的only if您还有其他方法可以保证每当使用该引用时引用的对象仍然有效。

除非您有充分的理由存储引用,并且有方法保证其保持有效,否则请按值存储它。

经过const对构造函数的引用是安全的,并且可能比传递值更有效。路过非const引用是一个坏主意,因为它阻止您传递临时值,因此用户不能直接传递 lambda,即bind,或任何其他可调用对象,除了std::function<int(int)> itself.

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

我应该复制 std::function 还是可以始终引用它? 的相关文章

随机推荐

  • 如何阻止连续打印多个买入/卖出信号?

    我正在尝试用我的脚本实现一些目标 如果前一个信号是 卖出 我只想打印 买入 信号 反之亦然 我只想在小于之前的 卖出 信号时打印 买入 信号 反之亦然 我一整天都在努力寻找这个问题的解决方案 我不明白如何使用 valuewhen 或 bar
  • 如何通过管道将输入和输出传送到交互式 shell?

    我正在尝试构建一个应用程序 使用户能够与命令行交互式 shell 例如 IRB 或 Python 进行交互 这意味着我需要将用户输入通过管道传输到 shell 并将 shell 的输出返回给用户 我希望这会像管道 STDIN STDOUT
  • Android 数据库(SQLite)从空表返回非空游标

    我使用 SQLite 数据库浏览器验证该表不包含任何行 我单步执行查询生成器代码来获取生成的查询 并在 SQLite 数据库浏览器中运行该查询 查询返回零行 但是 Android 的 SQLiteQueryBuilder query 方法返
  • 如何了解来自不同...“命名空间”的变量?

    如何从外部 javascript 文件中访问在另一个地方声明的某个变量 假设在一个 html 文件中我有以下内容 在 otherfile html 的部分中 我有 alert a 我如何确保收到一条提示消息 某事 我认为Google Ads
  • 使用 webpacker 部署到 heroku 后,资产不存在于资产管道中

    我正在使用 Rails 5 2 3 我可以在本地下载 pdf 但Heroku它通过错误 500 错误是 ActionView Template Error 资源 pdf css 不存在于资源管道中 这是我的 Heroku 日志 2019 0
  • 如何在android上的manageQuery中添加限制子句

    Android 的 API 通过 SQLite 提供了一种干净的机制来查询联系人列表 但是 我不确定如何限制结果 Cursor cur Activity mCtx managedQuery People CONTENT URI column
  • 如何清除gwt中的缓存?

    我怎样才能清除缓存gwt 或者有什么方法可以阻止浏览器保留缓存gwt 当您部署 GWT 应用程序时 避免代理和浏览器缓存 GWT 生成的 nocache js 文件非常重要 一种解决方案是实现一个 Servlet 过滤器 添加控制缓存行为的
  • 如何在react-native应用程序中禁用屏幕截图?

    我已经使用react native制作了一个移动应用程序 目前只有android 它不是博览会应用程序 我想禁止用户在应用程序打开时截取屏幕截图 我知道不可能完全禁用此功能 但我想让至少更难截取屏幕截图 我找到了一些例子 但我不知道如何实现
  • 一元运算符 ++ 不能应用于 Int 类型的操作数

    为什么下面的 swift 代码会给我带来错误 一元运算符 不能应用于 Int 类型的操作数 在 Xcode 6 3 2 上使用 swift 1 2 struct Set var player1Games Int var player2Gam
  • 如何将多个域路由到多个节点应用程序?

    我习惯了典型的 Lamp Web 托管环境 您只需单击 cpanel 中的几个按钮 您的域就会被分区并映射到 htdocs 中的文件夹 我经常使用 Node js 但做同样的事情似乎并不那么简单 如果我有多个节点应用程序 并且我想将doma
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • 将列从日期转换为日期时间

    我有一个名为Lastmodified 数据类型为Date 但本来应该是DateTime 有没有办法转换列 当我使用 SQL Server Management Studio 的 设计 功能时 出现以下错误 不允许保存更改 您所做的更改需要以
  • C 中的 NULL 是否需要/定义为零?

    在我的 GCC 测试程序中 NULL 似乎为零 但维基百科说NULL只需要指向不可寻址的内存 有编译器做吗NULL非零 我很好奇是否if ptr NULL 是比更好的练习if ptr NULL is guaranteed to be zer
  • 如何禁用 AngularJS 中输入的修剪?

    我发现了一些奇怪的行为 默认情况下角度修剪模型值 快速谷歌搜索并不能帮助我解决这个问题 我发现了ng no trim指导性建议 ng trim等等 但没有任何作用 我在下面提供了一个代表这个问题的小片段 function Ctrl scop
  • 解压缩 GZIP http 响应(使用 jersey 客户端 api、java)

    有人可以告诉我在从某些 Http 调用获取响应时需要做什么才能解压缩 GZIP 内容吗 为了进行调用 我使用 Jersey Client API 请参阅下面的代码 String baseURI http api stackoverflow
  • 在 C++ 中是否有一种简单的方法可以将由空格字符分隔的一行输入拆分为整数?

    我是一名 C 初学者 我一直在开发一个项目 在该项目中 您必须输入一些用空格分隔的整数 并且程序必须输出所有可能的整数排列 我知道在 python 中 这可以使用 int item for item in input split 但我不知道
  • 更改 NSTextView 中空格字符的宽度

    我正在尝试制作一个阅读器应用程序来帮助有阅读困难的女孩 一些研究表明 仅仅改变文本 背景和阴影的颜色确实可以帮助孩子们摆脱困境 所以我试图让她这样做 它只是一个带有按钮的大 NSTextView 因此她可以更改字体大小 颜色 背景颜色 阴影
  • 更改创建 XML 读取器时使用的 XmlDictionaryReader Quotas 对象的 MaxArrayLength 属性

    我在向 C 服务发送 或接收 字节数组时遇到以下异常 There was an error deserializing the object of type System Byte The maximum array length quot
  • 为什么 clojure future 会阻塞主线程?

    我有一个简单的 lein 项目 其中 main包含一个未来 def f future 42 defn main args println f 当我跑步时lein run它打印42但不返回 我不明白为什么它不返回 如何得到lein run回来
  • 我应该复制 std::function 还是可以始终引用它?

    在我的 C 应用程序 使用 Visual Studio 2010 中 我需要存储 std function 如下所示 class MyClass public typedef std function