• 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。

  • 相关阅读:
    [C数据结构]顺序栈
    java8 新特性5 方法引用
    UML List 集合(超详解)
    cocos2dx——多段式进度条实现思路
    智慧城市中的数字孪生:数字孪生技术助力智慧城市提高公共服务水平
    【云原生之kubernetes实战】在k8s环境下部署CodiMD个人文本编辑器
    2022新版PMP考试有哪些变化?
    gRPC四种通信模式
    C++:内存管理
    STM32F103+1.3“SH1106 IIC内容滚动显示示例
  • 原文地址:https://blog.csdn.net/gouguofei/article/details/126116241