将左值绑定到右值引用时 std::forward 与 std::move

2024-03-29

这里的移动和前进有区别吗:

void test(int && val)
{
    val=4;
}

void main()
{  
    int nb;
    test(std::forward<int>(nb));
    test(std::move(nb));
    std::cin.ignore();    
}

根据您的具体情况,不,没有任何区别。

详细解答:

在引擎盖下,std::move(t) does static_cast<typename std::remove_reference<T>::type&&>(t), where T是类型t(参见第 20.2.3/6 节)。在你的情况下,它解决了static_cast<int&&>(nb).

forward有点棘手,因为它是为在模板中使用而定制的(以允许完美转发),而不是作为将左值转换为右值引用的工具。

标准库提供了两种重载(一种用于左值引用,第二种用于右值引用,请参阅§20.2.3/2):

template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;

替代int,我们得到:

int&& forward(int& t) noexcept;
int&& forward(int&& t) noexcept;

自从nb是左值,选择第一个版本。根据标准草案,唯一的效果是forward is static_cast<T&&>(t). With T being int,我们得到static_cast<int&&>(nb),即 - 我们得到两个完全相同的演员表。

现在,如果您想将左值转换为右值(以允许移动),请仅使用std::move,这是进行此转换的惯用方法。std::forward不打算以这种方式使用。

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

将左值绑定到右值引用时 std::forward 与 std::move 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 在 .NET Core 中从 HttpResponseMessage 转换为 IActionResult

    我正在将之前在 NET Framework 中编写的一些代码移植到 NET Core 我有这样的事情 HttpResponseMessage result await client SendAync request if result St
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 应在堆栈上分配的最大数量

    我一直在寻找堆栈溢出有关应在堆栈上分配的最大内存量的指南 我看到了堆栈与堆分配的最佳实践 但没有关于应该在堆栈上分配多少以及应该在堆上分配多少的指南 有什么想法 数字可以作为指导吗 什么时候应该在堆栈上分配 什么时候应该在堆上分配 多少才算
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir

随机推荐

  • 如何取消屏蔽 JavaFX 密码字段或正确屏蔽文本字段?

    在我的用户界面中 我有一个密码字段 http docs oracle com javafx 2 api javafx scene control PasswordField html像这样 呃 最下面那个 我希望用户能够选中您在图片中看到的
  • 更改 window.location.ancestorOrigins

    有什么办法可以改变或阻止使用window location ancestorOrigins在 Chrome 下的 iframe 网站中 出于安全原因 我不希望 iframed 页面能够检测到顶部 url 在 Firefox 下 如果指向另一
  • XCode 4 存档错误:找到一个或多个 PCH 文件,但它们无效

    在此记录一个奇怪的 XCode 4 错误以供将来参考 找到一个或多个 PCH 文件 但它们无效 清理并不能解决问题 您需要通过按住 ALT 并从菜单中选择产品来清理构建文件夹 清理 条目现在已更改为 清理构建文件夹 这将擦除不良的 PCH
  • 对project.json中的依赖关系感到困惑

    在project json 文件中 我们有一个依赖项部分 然后我们还有一个框架部分 其中每个框架下可以有更多依赖项 我很困惑为什么有时依赖项需要放在框架部分而有时需要放在主要依赖项部分 例如 在我的几个项目中 我在 dnxcore50 下有
  • Google Maps API v3 For 循环问题

    也许我完全偏离了我想做的事情 但我很想回到版本 2 因为我可以轻松地工作 但我希望对移动设备友好 我正在尝试生成一些标记 为了保存代码 我将标记生成放入 for 循环中 该循环循环遍历标记数组 有实际值而不是 long lat x x x
  • SELECT FOR UPDATE 在 MySQL 中保存整个表而不是逐行保存

    我将让多个客户端将数据输入数据库 并且我必须确保事务不会混合在一起 我在文档中读到START TRANSACTION and SELECT FOR UPDATE锁定它读取的每一行 SELECT FOR UPDATE 读取最新的可用数据 并在
  • 在多个编辑器之间共享 Quill 工具栏

    与伟大的Quill http quilljs com Javascript 的富文本编辑器 我试图让两个或更多编辑器共享同一个工具栏 我想 从文档 http quilljs com docs api 目前这是不可能的 所以我试图通过 API
  • 将 AngularJs 1.5 升级到 1.6 - $compile reg 控制器实例的更改会影响哪些具体绑定?

    文档 https docs angularjs org guide migration migrate1 5to1 6 ng services 24compile从 AngularJs 1 5 升级到 1 6 时 compile 的变化如下
  • 尝试从屏幕+麦克风录制流时收到“DOMException:由于关闭而失败”

    我正在构建一个扩展程序 它也可以记录我的屏幕和麦克风音频 概述 我有 content js 尝试访问navigator mediaDevices getUserMedia 接下来我向background js发送消息 它再次尝试访问navi
  • Swing - MaskFormatter - 从文本字段右侧输入数字

    我是 Swing Java 开发的新手 有人可以帮我解决这个问题吗 我有一个带有 maskformatter 的 jformattedtextfield 它工作得很好 但我唯一想知道的是我们是否可以使其从右侧输入数字 下面的代码可以很好地从
  • jQuery 过滤器:包含链接(a href="#")

    我有一个当前的链接 a href 但很快客户就会将链接更改为 a href something 当链接变成某种东西时 我想使用 jQuery 来更改 css 但我不知道如何为属性编写过滤器 href 您可以使用以下两个选项来比较您的href
  • cypress 支持软断言吗?

    cypress 支持软断言吗 例如 我正在浏览 n 个元素并想要验证它们的值 如果任何元素的值不匹配 则测试失败 它不会继续验证下一个元素的值 有没有办法验证所有元素值并在最后显示失败的值 EDIT 我可能误解了 如果你的意思是软断言cy命
  • Cookie 未更新

    我正在尝试更新 cookie 值 但它不起作用 我尝试过的所有操作都不会更新 cookie 而且我总是得到 cookie 的初始值 所以我进行了搜索 根据 MSDN 我应该能够通过执行以下操作来更新 cookie HttpCookie co
  • JFrame背景图片

    我正在创建一个简单的 GUI 我希望有一个背景图像 2048 X 2048 填充整个窗口 并在左上角有一个正方形 可以偶尔加载 64 X 64 图像 如何才能做到这一点 我已经知道如何设置 JFrame 的大小 它的图像加载我需要帮助 这是
  • 为什么 java.awt.Point 提供了设置和获取双精度数的方法,但将 x 和 y 存储为 int?

    正如您在 Oracle 文档中看到的java awt Point http docs oracle com javase 6 docs api java awt Point html x 和 y 存储为int 然而 getX and get
  • 创建服务(SERVICE_ACCEPT_SESSIONCHANGE)

    我正在尝试按照以下链接中记录的示例创建服务 http msdn microsoft com en us library bb540475 v VS 85 aspx http msdn microsoft com en us library
  • git-svn 变基错误

    运行 git svn rebase 后出现以下错误 update index refresh 命令返回错误 1 有任何想法吗 以下是整个输出 git svn rebase dry run xxx iphone xxx prototype2
  • 查找字符串中的所有字符串

    我通过 http 请求响应文本获取 StrTxt 作为 html 字符串 我想找到 StrTxt 中所有出现的 字符串 像这样的东西 for each string in StrTxt StrTxt all matched strings
  • $location.path 在一定的超时后不起作用

    我正在尝试执行登录身份验证 并且正在尝试使用 angularJS 显示进度视图 例如 app config function locationProvider routeProvider routeProvider when templat
  • 将左值绑定到右值引用时 std::forward 与 std::move

    这里的移动和前进有区别吗 void test int val val 4 void main int nb test std forward