• C++左值引用与右值引用


    首先,我们需要知道什么是值语义,什么是引用语义。

    值语义:
    • 值语义意味着对象在被传递、赋值或拷贝时,会复制其整个数据。
    • 当使用值语义时,对对象进行操作不会影响原始对象,因为操作会在副本上进行。
    • 传统的内置类型(如整数、浮点数等)通常具有值语义。
    引用语义:
    • 引用语义意味着对象在被传递、赋值或拷贝时,不会复制其整个数据,而是共享相同的数据。
    • 当使用引用语义时,对对象的操作会影响所有引用该对象的变量,因为它们都指向相同的内存位置。
    • 指针和引用是引用语义的典型例子。

    对于GC语言,大部分变量都是引用语义,内存管理交给GC。而值语义可以更方便直观控制对象生命周期,让RAII使用更自然。

    其次,我们需要区分一下左值与右值:

    左值:
    • 可以在等号左边,可以取地址,具名
    • 比如变量名,返回左值引用的函数调用,前置的自增自减,赋值运算和复合赋值运算,解引用
    右值:
    • 只能在等号右边,不能取地址,不具名
    • 纯右值
      • 字面量,返回非引用类型的函数调用,后置自增自减,算数/逻辑表达式
    • 将亡值
      • C++11引入与移动语义相关的值类型(移动构造、移动赋值运算符重载),转移上资源,不可以转移上资源

    区别:

    1. 左值引用是对左值的引用;右值引用是对右值的引用
      • const左值引用能指向右值,但不能修改
      • 右值引用通过std::move()指向左值
      • 声明出来的左值引用和右值引用都是左值
    2. 功能差异:
      • 左值引用避免拷贝,如函数传参,函数返回值
      • 右值引用实现移动语义:
        • 对象赋值时,避免资源的重新分配
        • 移动构造,移动赋值运算符重载
        • STL
        • std::unique_ptr
        • std::function

    注:std::forward()是与universal reference相配合使用

    最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

  • 相关阅读:
    Unity求物体关于平面镜像对称后坐标以及旋转
    rpc汇总
    AUTOSAR配置工具开发教程 – 改造篇(方法创建)
    第四章运算符
    STM32Cube学习(5)——PWM
    spring面试题
    如何阻止事件冒泡和默认事件
    Java项目:小说阅读管理系统(java+JSP+bootstrap+Servlet+Mysql)
    StarkWare:关于Cairo的10个资源
    平时的工作如何体现一个人的技术深度?
  • 原文地址:https://blog.csdn.net/Faya__/article/details/138171483