首先,我们需要知道什么是值语义,什么是引用语义。
值语义:
- 值语义意味着对象在被传递、赋值或拷贝时,会复制其整个数据。
- 当使用值语义时,对对象进行操作不会影响原始对象,因为操作会在副本上进行。
- 传统的内置类型(如整数、浮点数等)通常具有值语义。
引用语义:
- 引用语义意味着对象在被传递、赋值或拷贝时,不会复制其整个数据,而是共享相同的数据。
- 当使用引用语义时,对对象的操作会影响所有引用该对象的变量,因为它们都指向相同的内存位置。
- 指针和引用是引用语义的典型例子。
对于GC语言,大部分变量都是引用语义,内存管理交给GC。而值语义可以更方便直观控制对象生命周期,让RAII
使用更自然。
其次,我们需要区分一下左值与右值:
左值:
- 可以在等号左边,可以取地址,具名
- 比如变量名,返回左值引用的函数调用,前置的自增自减,赋值运算和复合赋值运算,解引用
右值:
- 只能在等号右边,不能取地址,不具名
- 纯右值:
- 字面量,返回非引用类型的函数调用,后置自增自减,算数/逻辑表达式
- 将亡值:
C++11
引入与移动语义相关的值类型(移动构造、移动赋值运算符重载),转移堆上资源,不可以转移栈上资源
区别:
- 左值引用是对左值的引用;右值引用是对右值的引用
const
左值引用能指向右值,但不能修改- 右值引用通过
std::move()
指向左值 - 声明出来的左值引用和右值引用都是左值
- 功能差异:
- 左值引用避免拷贝,如函数传参,函数返回值
- 右值引用实现移动语义:
-
- 对象赋值时,避免资源的重新分配
- 移动构造,移动赋值运算符重载
- STL
std::unique_ptr
std::function
注:std::forward()
是与universal reference相配合使用
最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB