std::forward 与 std::move 的用法[重复]

2024-01-23

我总是读到std::forward仅适用于模板参数。然而,我问自己为什么。请参见以下示例:

void ImageView::setImage(const Image& image){
    _image = image;
}

void ImageView::setImage(Image&& image){
    _image = std::move(image);
}

这两个函数的作用基本相同;一个采用左值参考,另一个采用右值参考。现在,我想自从std::forward如果参数是左值引用,则应该返回左值引用;如果参数是 1,则应该返回右值引用,此代码可以简化为如下所示:

void ImageView::setImage(Image&& image){
    _image = std::forward(image);
}

这有点类似于 cplusplus.com 提到的示例std::forward(只是没有任何模板参数)。我只是想知道这是否正确,如果不正确,原因是什么。

我也在问自己到底有什么区别

void ImageView::setImage(Image& image){
    _image = std::forward(image);
}

You cannot use std::forward没有明确指定其模板参数。它是有意在非推导的上下文中使用的。

要理解这一点,您需要真正理解如何转发引用(T&&对于推导的T)在内部工作,而不是因为“这很神奇”而挥手而走。那么让我们看看这个。

template <class T>
void foo(T &&t)
{
  bar(std::forward<T>(t));
}

假设我们打电话foo像这样:

foo(42);
  • 42是类型的右值int.
  • T推导为int.
  • 致电给bar因此使用int作为模板参数std::forward.
  • 返回类型为std::forward<U> is U &&(在这种情况下,那就是int &&) so t作为右值转发。

现在,我们打电话foo像这样:

int i = 42;
foo(i);
  • i是类型的左值int.
  • 由于完美转发的特殊规则,当类型的左值V用于推导T在类型参数中T &&, V &用于扣除。因此,在我们的例子中,T推论为int &.

因此,我们指定int &作为模板参数std::forward。因此它的返回类型将是“int & &&”,折叠为int &。这是一个左值,所以i作为左值转发。

Summary

为什么这适用于模板是当你这样做时std::forward<T>, T有时是引用(当原始值是左值时),有时不是引用(当原始值是右值时)。std::forward因此将根据需要转换为左值或右值引用。

您无法在非模板版本中执行此操作,因为您只有一种类型可用。更不用说这样的事实setImage(Image&& image)根本不接受左值——左值不能绑定到右值引用。

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

std::forward 与 std::move 的用法[重复] 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • OpenCV 的视频捕获不返回图像

    所以我尝试开始使用 OpenCV 进行图像检测 我正在用 Python 编程 我从 openCV2 的人脸检测示例开始 然而 即使打开相机设备 也不会返回任何图像 违规代码 cam cv2 VideoCapture 0 print cam
  • 强制 MigLayout 像 GridBagLayout 一样收缩隐藏对象

    我正在尝试更换GridBagLayout with MigLayout 问题是如果我打电话obj setVisible false 对于某些对象GridBaglayout 布局缩小 但在MigLayout它只是保持隐藏状态 你知道一些方法吗
  • 从 Excel 导入 - 标题不在第 1 行

    我是否缺少一些简单的方法来使用 OleDBConnection 将 Excel 工作表导入数据表并更改标题所在的行 我的连接字符串中有 HDR YES 当标题位于第 1 行但标题实际上需要位于第 3 行时效果很好 我正在使用以下 Comma
  • ggplot 饼图中的标签错误

    我正在尝试为百分比值创建饼图 当我尝试为它们添加标签时 标签是错误的 我的意思是这些值指向图表中的错误位置 ggplot Consumption building type aes x y percentage fill Building
  • 如何对齐 Bootstrap 导航栏中留下的品牌标题和链接?

    我是 Bootstrap 的新手 我一直在努力了解导航栏 我注意到 当浏览器为全 宽屏 宽度时 品牌标题和导航锚点保持在页面的左侧中心 而不是像窗口较小时那样与页面的最左侧对齐 如何使导航栏中的文本紧贴页面左侧 无论浏览器窗口有多宽 我都希
  • async/await 如何在 ASP.Net 应用程序中提供帮助?

    在MVC控制器的action方法中使用async await可以扩展Web应用程序 因为在await时 Asp Net线程池的请求线程被释放 以便它可以为该工作进程处理IIS队列中的其他请求 这意味着 如果我们将工作进程的队列长度限制为 1
  • 如何知道 JUnit 测试触及了哪些类

    以编程方式了解 JUnit 测试涉及哪些类的有效方法是什么 正确的知道 我正在用以下工具来检测我的整个代码JaCoCo http www eclemma org jacoco 获取每行代码的代码覆盖率信息 然后我可以找出使用了哪些类 是否可
  • 我应该如何在类层次结构中链接构造函数?

    我们有以下类层次结构 public class Base public Base do generic initialization public Base SomeClass param1 this init properties tha
  • “额外的间接级别可以解决所有问题”这句话是什么意思? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 计算机科学中的 间接级别解决每个问题 这句话是什么意思 一般来说 这意味着通过提高抽象级别可以使问题更容易理解 解决 不过 要小心你的
  • 隐藏第 n 最大行的 VBA 代码

    Excel 2010 VBA 中是否有任何代码可以用来隐藏第 n 行 例如第 200 行 到最大行 顺便说一句 该表的名称特别是main 通常我会告诉你尝试否决你的问题 但是嘿 今天早上我很懒 所以我只会给你你没有找到的答案 Rows 20
  • 如何从 spring RESTful 服务返回 JSON 并使用 RestTemplate 类访问它

    我制作了一个 Spring RESTful Web 服务 用于以 JSON 格式提供热门歌曲列表 为此 我在列表中添加了歌曲名称 并从 Spring RESTful Web 服务的 Restcontroller 返回了该名称 所以 Rest
  • LinearLayout 的点击监听器永远不会被调用

    尝试让 onclick 侦听器在线性布局上工作 但它从未被调用 已启用可点击和可聚焦 两种模式 但仍然无法让点击侦听器响应 平台详细信息 Android 3 0 有任何帮助吗 下面的代码
  • 使用表单生成器将字段的值显示到 Rails 中的标签中

    我正在使用 Rails 3 2 并且需要使用表单生成器对象显示标签中字段的值 在文本框中显示它很简单 但我无法在标签中做到这一点 代码是这样的 上面的 f 是我的表单生成器 我的模型有一个名为 key name 的字段 第二行工作正常 我将
  • addslashes() 可以安全地防止 HTML 属性中的 XSS 吗?

    我不得不开发一个以前的开发人员留下的旧网络应用程序 它使用addslashes 来防止HTML属性上的XSS 这是一个例子 这是否容易受到 XSS 攻击 有没有什么方法可以让 javascript 在 value 属性中运行 就像在 src
  • 未定义的方法“分页”

    我正在尝试使用 will paginate gem 但出了点问题 我被困住了undefined method paginate 错误 我读了很多问题并尝试了很多事情 这是我所得到的 这是我的 LocationsController rb d
  • 在 pytube 中显示进度

    import pytube def video downloader vid url str input Enter Video URL print Connecting Please wait video pytube YouTube v
  • 在 ASP.NET 中处理数据时如何更新进度消息?

    我有一个流程 它输出逐步消息 即 处理项目 1 项目 2 中的错误等 我希望在整个过程中 而不是最后 将其输出给用户 我很确定我需要使用线程来完成此操作 但找不到合适的示例 这不是线程问题 而是 Web 浏览器 UI 问题 您希望浏览器在您
  • 如何仅对我想要提交的文件运行 Prettier?

    Using Husky https github com typicode husky 我已经设置了我的package json使用预提交挂钩 以便我的 JavaScript 代码使用以下格式进行格式化Prettier https pret
  • 具有模板参数大小的 const char 数组与 char 指针

    今天我在一些代码中看到了以下类型的构造 template
  • std::forward 与 std::move 的用法[重复]

    这个问题在这里已经有答案了 我总是读到std forward仅适用于模板参数 然而 我问自己为什么 请参见以下示例 void ImageView setImage const Image image image image void Ima