当我不知道它是否是临时的时,C++ 返回类型

2024-04-19

假设Foo是一个相当大的数据结构。我应该怎样写一个const返回实例的虚函数Foo,如果我不知道继承的类是否会存储Foo内部;因此,允许通过引用返回。如果我无法在内部存储它,我的理解是我无法返回const引用它,因为它将是临时的。它是否正确?这两个选项是:

virtual Foo foo() const { ... }
virtual Foo const & foo() const { ... }

这是一个相关问题 https://stackoverflow.com/questions/2182408/return-a-const-reference-or-a-copy-in-a-getter-function但从不同的角度来看。


您对值返回和 const 引用返回之间的差异感兴趣只是为了优化问题,但事实并非如此。有一个本质上的不同meaning每次返回不同的值与每次返回一个引用(很可能是同一个对象,很可能可以修改)之间:

const Foo &a = myobj.foo();
myobj.modify_the_foo();
const Foo &b = myobj.foo();
a == b; // do you want this to be true or false?

调用者需要知道它是什么,既因为程序员需要知道含义,又因为编译器需要知道调用约定,因此不能将它们混合在同一虚函数的不同重写中。如果一些派生类想要执行其中一项操作,而另一些派生类则想要执行另一项操作,那么运气不好,他们不能,任何一个都不能返回一个int和另一个float.

你也许可以返回一个shared_ptr。这样,“想要”返回引用的派生类可以创建一个shared_ptr使用不执行任何操作的删除器(但要注意 -shared_ptr如果原始对象被破坏,它将悬空,这不是您通常期望从返回的shared_ptr。所以如果这对Foo为了比它来自的对象活得更长久,那么类最好动态分配它,通过shared_ptr,并返回该副本的副本,而不是无所事事的删除器)。 “想要”返回值的派生类每次都可以分配一个新值。自从Foo是“相当大”,希望成本shared_ptr与您无论如何都要创建要返回的新值相比,动态分配并不算太痛苦。

另一种可能是转Foo到一个小的 pImpl 风格的类中,该类引用了一个相当大的数据结构。如果涉及的所有内容都是不可变的,那么“想要返回引用”的情况可以在多个之间共享大数据结构Foo实例。即使不是,您也可以考虑写时复制。

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

当我不知道它是否是临时的时,C++ 返回类型 的相关文章

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

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

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • git 存储库有命名约定吗?

    例如 我有一个名为 购买服务 的 RESTful 服务 我应该命名我的存储库 purchaserestservice purchase rest service purchase rest service 或者是其他东西 约定是什么 在 G
  • React:未捕获类型错误:无法读取未定义的属性

    这个问题已经解决了 向下滚动或点击这里 https stackoverflow com a 73523801 19124473查看解决方案 我正在尝试使用 React 从我的服务器中提取 JSON 数据并使用两个函数渲染它 但是两个渲染函数
  • App Engine:基于环境的不同 app.yaml 文件

    我目前正在将一个应用程序迁移到 Google App Engine 该应用程序依赖于各种外部连接的环境变量 看起来 app yaml 文件是我应该设置这些配置的地方 但是如何管理这些变量可能不同的不同环境 开发 测试 登台 生产 最简单的解
  • 如何在 iPhone 中设置此布局需要一些帮助

    I have Implement Some paint like application For that the Layout is like as below 这里有一个视图和两个按钮 在我的应用程序中 我从 Button2 选择颜色
  • 使用 Angular 2 连接 Google Maps Nativescript 插件

    我正在尝试使用 Nativescript 的 Google 地图插件 https github com dapriett nativescript google maps sdk https github com dapriett nati
  • Android JNI,有什么方法C++代码可以直接读取应用程序的sqlite数据库吗?

    我正在开发一个带有 Java 组件和通过 JNI 的 C 组件的 Android 应用程序 C 组件用于其他平台 如果 C 组件可以查询现有的 SQLite 数据库 通过 SQLite C API 而无需向 Java 端进行 shell 调
  • SQL Server 根据不同标志计算累计总和/条件运行总和

    我在 SQL Server 中有一个表 其中的数据类似于此示例 ID Flag Art No Amount 1 U A1000 100 2 U B2000 5 3 V B2000 900 4 U B2000 10 5 I B2000 50
  • PHP:PDF 生成

    我目前正在一个网站上工作 基本上 当用户搜索某些内容时 我应该能够为每个搜索结果项生成 pdf 我知道 fpdf 的一种选择 有没有比 fpdf 更简单的东西或某些服务 例如如果我发送搜索结果页面的 url 它会将生成的 pdf 发送回给我
  • Lua:冒号符号、“自我”和函数定义与调用

    我对定义 调用 Lua 函数时使用的冒号表示法感到非常困惑 我以为我已经明白了 直到我看到这段代码 function string PatternSafe str return str gsub pattern escape replace
  • 如何“全局”“重载”python的打印函数?

    我使用的是 python 2 6 6 我需要重载默认的 python 打印函数 我需要这样做 因为此代码可能在必须使用内置函数来生成输出的系统上使用 否则不会显示任何输出 举例来说 如果你有一个像这样的 python 脚本 from fut
  • 是否可以像在 CodeIgniter 中一样获取 ExpressionEngine 中的所有后期变量?

    在 CI 的控制器中 您可以通过执行以下操作来获取所有后置变量 data this gt input gt post 在 EE 由同一个人基于 CI 构建 中 类似的语法是 data this gt EE gt input gt post
  • 将 UITableView 分隔符隐藏在 contentView 后面

    我在 iPhone OS 3 0 中制作了一个分组 UITableView 如下图所示 结果是 OS 3 1 中的正确图像 imageView 位于分隔符下方 我尝试将内容视图放在前面 当 tableView 处于分组样式时 我自己绘制分隔
  • JPA 与 Hibernate 3.6.8.Final、PostgreSQL 9.1、SQLGrammarException - 配置问题?奇怪的SQL语句

    Edit SOLVED正确的 我发现了让我困惑的事情 我使用 pgadmin 创建表和其他数据库内部结构 现在检查 如果名称 表名称 列名称 pk 名称等 中至少有一个字母为大写 则 pgadmin 在 SQL 创建脚本中使用它实际上 使用
  • ASP.Net 在会话 cookie 中存储用户密码?

    我知道会员资格提供商将用户名和过期时间存储在加密的 cookie 中 然后使用它来验证用户是否仍然登录会话 是否也可以将用户密码存储在这个加密的 cookie 中 如果是这样 您将如何在服务器端访问它 我需要服务器端可用的用户名和密码 因为
  • MySQL + Code First + 延迟加载问题!

    在一个非常简单的房地产程序中 我尝试使用 EF Code First 列出房屋的所有图像 附加到我拥有的现有数据库 我使用 MySQL Conector 6 3 6 这是我的代码 namespace CodeFirstMySQL class
  • 通过 unix shell 命令查找给定文件扩展名的首选应用程序

    这可能不是strictly关于编程 但如果我找不到现成的解决方案 它可能会成为一个编程任务 在 UNIX 上 用于确定给定文件类型的用户首选应用程序的命令行方法是什么 我理想的解决方案是一个命令 让我不必执行以下操作 okular foo
  • OnItemCLickLIstener 不适用于 ListView

    我有一个带有 ListView 的活动 具有自定义视图的 ListView 我将 OnItemClickLIstener 添加到 ListView 中 当我点击项目时 结果我什么也没看到 ListView 的活动
  • 从日期中减去时间 - 时刻 js

    例如我有这个日期时间 01 20 00 06 26 2014 我想减去这样的时间 00 03 15 之后我想将结果格式化为这样 3 hours and 15 minutes earlier 我怎样才能做到这一点使用moment js edi
  • useReducer Action 调度两次

    Scenario 我有一个返回操作的自定义挂钩 父组件 Container 利用自定义钩子并将操作作为 prop 传递给子组件 Problem 当从子组件执行操作时 实际调度会发生两次 现在 如果子级直接使用钩子并调用操作 则调度仅发生一次
  • 当我不知道它是否是临时的时,C++ 返回类型

    假设Foo是一个相当大的数据结构 我应该怎样写一个const返回实例的虚函数Foo 如果我不知道继承的类是否会存储Foo内部 因此 允许通过引用返回 如果我无法在内部存储它 我的理解是我无法返回const引用它 因为它将是临时的 它是否正确