在多个 return 语句的情况下,使用 `std::move` 返回是否明智?

2024-01-11

我知道返回通常不是一个好主意std::move, i.e.

bigObject foo() { bigObject result; /*...*/ return std::move(result); }

而不是简单地

bigObject foo() { bigObject result; /*...*/ return result; }

因为它妨碍了返回值优化。但是,如果一个函数有多个不同的返回值,特别是像这样的函数,该怎么办?

class bar {
  bigObject fixed_ret;
  bool use_fixed_ret;
  void prepare_object(bigObject&);
 public:
  bigObject foo() {
    if(use_fixed_ret)
      return fixed_ret;
     else{
      bigObject result;
      prepare_object(result);
      return result;
    }
  }
};

我认为在这样的函数中正常的返回值优化是不可能的,所以放入

      return std::move(result);

在这里,或者我应该这样做(我认为更丑陋,但这是有争议的)

  bigObject foo() {
    bigObject result;
    if(use_fixed_ret)
      result = fixed_ret;
     else{
      prepare_object(result);
    }
    return result;
  }

For local variables, there's no need to std::move them in the return statement most of the time, since the language actually demands that this happens automatically:

§12.8 [class.copy] p32

当满足或将满足复制操作省略的条件时,除了源对象是函数参数这一事实之外,并且要复制的对象由左值指定,首先执行重载决策以选择复制的构造函数,就像该对象由右值指定一样。如果重载决策失败,或者所选构造函数的第一个参数的类型不是对象类型的右值引用(可能是 cv 限定的),则将再次执行重载决策,并将该对象视为左值。 [Note:无论是否发生复制省略,都必须执行此两阶段重载决策。如果不执行省略,它确定要调用的构造函数,并且即使省略调用,所选构造函数也必须可访问。——尾注 ]


† 复制省略的应用范围非常有限(§12.8/31)。其中一项限制是,在处理 return 语句时,源对象的类型必须与函数的 cv 无限定返回类型相同。它也不适用于即将超出范围的局部变量的子对象。

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

在多个 return 语句的情况下,使用 `std::move` 返回是否明智? 的相关文章

  • “字符串”是什么意思?信息'

    我刚刚在查看定义时发现了这个PlatformNotSupportedException class 什么是string message意思是 据我所知是 是缩写Nullable lt gt but Nullable lt gt 只能应用于结
  • dup2() 和 exec()

    include
  • 如果两个线程同时访问同一个 bool 变量会发生什么?

    我有一个跨平台 C 程序 其中使用 boost 库创建异步计时器 我有一个全局变量 bool receivedInput false 一个线程等待并处理输入 string argStr while 1 getline cin argStr
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 为什么这个单独的定义会导致错误?

    挑战 我有这段代码无法编译 你能找出问题所在吗 有一次让我很头疼 header namespace values extern std string address extern int port cpp file std string v
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • Nuget - 对象引用未设置为对象的实例

    我在 vs 2015 中遇到了 nuget 包管理器的问题 像Unity这样的一些包已经安装没有问题了 某些软件包 例如 EF 在安装时出现问题 像 Automapper 这样的一些软件包也有同样的问题 但是当我安装这个软件包的另一个版本时
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • “显式”关键字对返回值优化 (RVO) 有何影响?

    以下代码工作得很好 显示 RVO struct A A int cout lt lt A A n constructor A const A cout lt lt A A const A n copy constructor A foo r
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • 如何覆盖 XAMARIN.FORMS 的加载视图

    选择任何列表视图时如何使用覆盖活动指示器
  • IdentityServer4登录API

    我使用 IdentityServer4 来保护我的 API 并验证用户身份 客户端是主要的 ASP NET Core MVC 应用程序 我只希望登录界面和 UI 位于 MVC 应用程序处 登录实现位于 IdentityServer 处 所以
  • 静态页面的 htaccess 条件 https

    我的网站是已启用 HTTPS所有页面均使用仅 HTTPS 客户现在有他想要的要求显示静态页面 例如about us termsofus作为 HTTP 页面而不是 HTTPS 这意味着即使用户尝试打开about us页面作为 HTTPS 它应
  • 在 Redshift 中匹配连续数字 REGEXP_REPLACE

    我正在尝试从 Redshift 中的字符串中删除连续的数字 From 16 16 16 3 3 4 16 16 我想要得到 16 3 4 16 以下构造对我不起作用 SELECT regexp replace 16 16 16 3 3 4
  • 将flutter web和desktop添加到android studio中现有的flutter(android/ios)项目中

    我知道这可能还为时过早 但我想尝试在一个项目中使用完整的 flutter 现有跨平台支持 稳定性不是我主要关心的 我已经在 android studio 中启动了一个 flutter 项目 当然我 android Ios 进展顺利 但我很想
  • VS 2010,编码的 UI 测试:重新运行失败的测试用例

    我正在使用 VS2010 Premium 编码 UI 测试 您知道如何在运行后重新执行失败的测试用例吗 如果重新执行后测试通过 则应在结果报告中记录通过 不是最佳方式 但您可以将所有代码放入try catch如果抛出异常 则阻止并重新运行测
  • 当用户离开页面时,如何检测表单中未保存的数据?

    当用户离开页面而不提交表单时 我需要检测表单中未保存的数据 我想实现这一点 而不为每个输入添加值更改侦听器 这是功能要求 如果页面中的值发生更改 用户打开页面而不是单击任何链接 则会弹出警报消息 通知用户他需要保存更改的数据 但如果没有更改
  • 无法从 Strapi API 获取数据到 next.js 前端

    我尝试过 Strapi 和 next js 来制作博客网站 这是前端代码的 next js import Head from next head import styles from styles Home module css expor
  • 纯javascript:为可拖动元素设置边框

    再会 学习 Javascript 并尝试在容器内制作可拖动的元素 如何设置可拖动边框以使元素无法移动到其之外 现在 当您将某些内容拖动到底部或右边框时 我遇到一个问题 该元素会移到容器之外 fiddle https jsfiddle net
  • 22秒是在mysql中插入500行的好时间吗?

    以下 php 脚本的执行时间约为 22 秒 正常吗 如果不是的话 什么会导致它执行缓慢 conn mysql connect localhost root 123 mysql select db mydb conn time1 time f
  • Google Cloud HTTP 平衡器和 gzip

    当我使用 Google Cloud Network Load Balancer 时 所有 HTTP gzip 连接都保持不变 但是当使用 HTTP S 负载均衡器时 最终用户无法获得 gzip 压缩的内容 我在虚拟机上使用 nginx 使用
  • 读取 XML 文档时如何使用 XComment?

    我正在使用以下行读取 XML 文档 该文档可能有也可能没有一些用 括起来的注释 靠近我的 XML 文件的顶部 XDocument xe1 XDocument Load filepath 如何读取评论并将其存储为字符串 我正在 MS Visu
  • 调试前运行批处理脚本

    我想每次在启动程序进行调试之前运行批处理脚本 对于构建事件 此类功能是使用预构建事件 构建后事件来实现的 对于实际调试 我找不到任何预调试 调试后事件 如何实现这个场景呢 我正在使用 VS2008 net Framework 3 5 C 应
  • Bootstrap 4:隐藏卡片文本中的溢出

    我有一张 bootstrap 4 卡 我想在其中隐藏字幕的溢出 并显示 我怎样才能实现这个目标 如果可能的话使用纯引导代码 div class card block p 1 p class card title Test object p
  • 解释 R Taply 描述

    我理解tapply 在R中的作用 但是 我无法从文档中解析它的描述 Apply a Function Over a Ragged Array Description Apply a function to each cell of a ra
  • 为什么括号中的字符串不只用该字符串创建一个元组? [复制]

    这个问题在这里已经有答案了 我在使用 Python 线程和在参数中发送字符串时遇到问题 def processLine line print hello return dRecieved connFile readline processT
  • bootstrap 导航栏可折叠无法使其工作

    我正在开发一个 Angularjs 应用程序 我想使其成为多平台 因此我正在尝试使用 Bootsrap 我找到了一个我想要遵循的模板 https blackrockdigital github io startbootstrap busin
  • Windows XP 上的 XamlParseException

    我有一个 WPF 应用程序 它在 vista 7 上运行得很好 但在 Windows XP 上它会抛出 System Windows Markup XamlParse 错误 这非常令人沮丧 因为我的应用程序中有很多控件 但我不这样做不知道是
  • 线程安全的多文件写入

    我有一个守护进程 它接受套接字连接并读取或写入一组动态文件 具体取决于连接的性质 因为我的守护进程是多线程的 所以存在同一个文件可能被多个线程写入的可能性 因为我的文件列表是动态的而不是固定的 所以我不确定如何防止一个线程碰撞另一个线程 出
  • 在多个 return 语句的情况下,使用 `std::move` 返回是否明智?

    我知道返回通常不是一个好主意std move i e bigObject foo bigObject result return std move result 而不是简单地 bigObject foo bigObject result r