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 的用法[重复] 的相关文章

  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • 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