码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • std::forward的神秘面纱


    1. void f4(const std::unique_ptr<int>& t) {
    2. // 左值匹配该函数
    3. printf("const std::unique_ptr&\n");
    4. }
    5. void f4(std::unique_ptr<int>&& t) {
    6. // 右值匹配该函数
    7. printf("std::unique_ptr&&\n");
    8. }
    9. void f4(const std::shared_ptr<int>& t) {
    10. // 左值匹配该函数
    11. printf("const std::shared_ptr&\n");
    12. }
    13. void f4(std::shared_ptr<int>&& t) {
    14. // 右值匹配该函数
    15. printf("std::shared_ptr&&\n");
    16. }
    17. template <class T>
    18. void f3(T&& t) {
    19. // t为模板参数,不知道传入的是左值还是右值,需要使用forward转发参数给f4
    20. f4(std::forward(t));
    21. }
    22. template <class T>
    23. void f2(T&& t) {
    24. // t为模板参数,不知道传入的是左值还是右值,捕获t的时候需要使用forward
    25. [t1 = std::forward(t)]() mutable {
    26. // 增加mutable属性是为了让捕获的参数可修改,此时t1的类型为T
    27. // 如果删除mutable属性,此时t1的类型为const T,使用move是无任何效果的
    28. // 使用std::move将t1强制转换成右值传递给f3(注意:如果没有mutable属性,虽然使用了std::move,但是传递给f3的还是左值)
    29. f3(std::move(t1));
    30. }();
    31. }
    32. template <class T>
    33. void f1(T&& t) {
    34. // t为模板参数,不知道传入的是左值还是右值,需要使用forward转发参数给f2
    35. f2(std::forward(t));
    36. }
    37. int main() {
    38. auto p = std::make_unique<int>(100);
    39. f1(std::move(p));
    40. assert(!p);
    41. auto p1 = std::make_shared<int>(200);
    42. f1(p1);
    43. assert(p1);
    44. f1(std::move(p1));
    45. assert(!p1);
    46. // 在有mutable属性的时候输出如下:
    47. // std::unique_ptr&&
    48. // std::shared_ptr&&
    49. // std::shared_ptr&&
    50. // 在没有有mutable属性的时候输出如下:
    51. // const std::unique_ptr&
    52. // const std::shared_ptr&
    53. // const std::shared_ptr&
    54. system("pause");
    55. }

    真正理解到了右值引用、引用折叠、变量生命周期就很容易明白什么时候使用std::move,什么时候使用std::forward。

  • 相关阅读:
    业务数据分析——同环比(待补全)
    文本处理技巧,Excel或csv转json
    java-php-python-ssm在校大学生健康状况信息管理系统计算机毕业设计
    Vue 将响应式数据转为普通对象
    Maven
    C++操作ZEROMQ
    小白学爬虫:通过关键词搜索1688商品列表数据接口|1688商品列表数据接口|1688商品列表数据采集|1688API接口
    浏览器批量采集网站标题 保存Excel表格
    ARM hint instruction-WFI(Wait For Interrupt)指令详解
    深入探索Java SPI机制-动态扩展的艺术
  • 原文地址:https://blog.csdn.net/gouguofei/article/details/126116241
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号