通过右值引用返回是否更有效?

2024-03-08

例如:

Beta_ab&& Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

这会返回一个悬空引用,就像左值引用的情况一样。函数返回后,临时对象将被破坏。你应该回来Beta_ab按值,如下所示

Beta_ab
Beta::toAB() const {
    return Beta_ab(1, 1);
}

现在,它正在正确地移动一个临时的Beta_ab对象转换为函数的返回值。如果编译器可以,它将通过使用 RVO(返回值优化)来完全避免移动。现在,您可以执行以下操作

Beta_ab ab = others.toAB();

它将把临时建筑移入ab,或者执行 RVO 以完全省略移动或复制。我推荐你阅读BoostCon09 右值参考文献 101 https://www.boostpro.com/trac/wiki/BoostCon09/RValue101这解释了这个问题,以及 (N)RVO 如何与之相互作用。


在其他情况下,返回右值引用的情况是一个好主意。想象一下你有一个getAB()您经常在临时调用的函数。让它返回右值临时值的 const 左值引用并不是最佳选择。你可以这样实现

struct Beta {
  Beta_ab ab;
  Beta_ab const& getAB() const& { return ab; }
  Beta_ab && getAB() && { return move(ab); }
};

注意move在这种情况下不是可选的,因为ab既不是本地自动右值也不是临时右值。现在引用限定符 &&表示在右值临时对象上调用第二个函数,进行以下移动,而不是复制

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

通过右值引用返回是否更有效? 的相关文章

随机推荐

  • 如何在 Asp.Net MVC 中使用属性路由为操作生成 URL

    public class HomeController Controller Route Users about Route Users WhoareWe Route Users OurTeam Route Users aboutCompa
  • Java Fx 将场景大小调整为舞台

    我进行了搜索 但找不到任何与我在 Fx 中遇到的问题相近的内容 我正在使用 Java Fx JDK 8 并且在调整场景大小时遇到 问题 下面的代码在场景图中一次仅加载一个屏幕 并在屏幕之间切换 问题是当我调整舞台大小时 场景没有随舞台调整大
  • Nexus S 上的 OpenGL ES 黑色纹理

    在 Nexus One 上运行的 OpenGL 代码在 Nexus S 上无法正常运行 纹理似乎没有渲染 纹理应该在的地方只剩下黑色 有人有什么想法吗 The 此处给出的已接受答案 https stackoverflow com quest
  • 第二次绑定源时Datagridview完全隐藏

    private void populateListingGrid try Dictionary
  • Kafka Streams 应用程序无尽的重新平衡

    我们正在运行一个卡夫卡流应用程序并遇到一个奇怪的问题 我们正在使用全局状态存储和多个其他状态存储 我们的应用程序已加载所有数据 状态存储中现在有大量信息 现在 当我们尝试关闭应用程序并再次将其恢复 一些配置更改 时 它会进入无休止的重新平衡
  • Matlab 从命名管道(fifo)读取

    我在 Linux 下的 matlab 中读取命名管道 fifo 时遇到问题 管道上的 textread 始终返回 空矩阵 0 1 textread 会阻塞 直到数据写入管道 如果我使用 fopen 和 fscanf 那么 fopen 将阻塞
  • Bootstrap 3列类干扰jquery-ui droppable div

    我使用 jQuery UI v1 11 2 来创建一些可拖动和可放置的 div 以及 Boostrap 3 1 1 我想知道为什么 Bootstrap 列类会干扰可拖动的 提示 换句话说 当我将图像从图库 div 拖到仪表板 div 时 仪
  • httpRuntime shutdownTimeout 和 IIS 设置

    我在 ASP Net 中遇到了一个问题 在任何 Web 应用程序配置 Web config 文件中 都有一个名为 httpRuntime 的部分 它有一个属性 shutdownTimeout 根据 MSDN 文档 该属性指定在 ASP Ne
  • 检测 Swing 中单击生成的 MouseEvent 上的 Shift 修饰符

    我正在使用 Java Swing 处理 GUI 应用程序中的一些 MouseEvent 从现在开始我正在分析 mousePressed 方法中的鼠标事件 只是为了确定是否 发生左键或右键单击 我的代码是 public void mouseP
  • React,未捕获的引用错误:ReactDOM 未定义

    我在做这个路由器教程 http www tutorialspoint com reactjs reactjs router htm 我的 App jsx 文件 import React from react import ReactDOM
  • int 和 char 数组有什么区别?

    下面 int 和 char 数组有什么区别 int main int numbers 2 1 3 char letter a b 0 cout lt lt numbers lt
  • C语言中的大整数?

    在 C 中处理大量数字的最简单方法是什么 我需要在区域中存储值1000 900 或者以更人类可读的形式10 2700 有谁知道一个简单的方法来做到这一点 任何帮助将不胜感激 Use libgmp http gmplib org GMP 是一
  • 从 ADO.NET 执行 T-Sql 视图

    是否可以从 C 代码执行视图 如果是的话我想知道参数化视图是否存在以及我应该如何使用它们 参数化意味着我们在存储过程中使用相同的参数来声明 where 条件 不执行视图 一个执行查询 如果查询从视图或表中选择行 ADO NET 不知道也不关
  • Ruby on Rails / Paperclip / AWS::S3::NoSuchBucket 错误

    我安装了回形针插件并能够在本地使用它 当我将其配置为与 amazon S3 一起使用时 我不断收到 NoSuchBucket 指定的存储桶不存在 错误 回形针文档指出 如果存储桶不存在 则会创建该存储桶 但很明显 我的情况出了问题 我首先安
  • Mysql中如何将数据合并到临时表中

    我有一张非常大的桌子 叫做paypal ipn orders 在这个表中 我有 2 个重要的信息 一行称为item name和一行称为sort num 我想使用某些参数从中提取记录paypal ipn orders并将它们放入一个名为的临时
  • MS Access SQL 中是否有与 SUBSTRING 函数等效的函数?

    我想在 MS Access 查询中执行类似的操作 但 SUBSTRING 是一个未定义的函数 SELECT DISTINCT SUBSTRING LastName 1 1 FROM Authors 您可以使用 VBA 字符串函数 正如 on
  • Django静态媒体不显示图片

    在寻找解决方案几个小时后未能解决我的问题后 我发布了此内容 我的媒体根目录中的图像没有显示在我的 html 上 在 chrome 的控制台中我得到一个404 file not found 尽管图像就在那里 我在 Pycharm 中使用 Py
  • Google 日历 feed timeMin timeMax 不起作用

    我从搜索中推断 限制日期范围的 Google 日历提要的 URI 应包括 timeMin 和 timeMax 还应包括 singleEvents 和 orderBy 这是我构建的 URI 无论我在投影值后放置什么查询参数 我仍然会获取从 8
  • 以编程方式使下载停靠栏图标弹起

    如何以编程方式使 Dock 下载 图标弹起 请注意 我不希望我的应用程序图标弹起 而只希望下载图标弹起 特别是 我正在将文件从我的应用程序下载到 下载 文件夹 这没问题 但我希望下载图标在下载完成时弹起 就像 Safari 完成下载时发生的
  • 通过右值引用返回是否更有效?

    例如 Beta ab Beta toAB const return move Beta ab 1 1 Beta ab Beta toAB const return move Beta ab 1 1 这会返回一个悬空引用 就像左值引用的情况一