C++ 右值引用

1.左值引用和右值引用的概念

什么是左值?什么是左值引用?

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。
什么是右值?什么是右值引用?

右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。右值引用就是对右值的引用,给右值取别名。

2.左值引用与右值引用比较

左值引用总结:

  1. 左值引用只能引用左值,不能引用右值。

  2. 但是const左值引用既可引用左值,也可引用右值。
    右值引用总结:

  3. 右值引用只能右值,不能引用左值。

  4. 但是右值引用可以move以后的左值。

cpp 复制代码
	int b = 10;
	int&& a = 10;
	int&& c = move(b);

3.为什么引入右值引用

左值引用的短板:

但是当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回,传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造)。
右值引用和移动语义解决上述问题:

移动构造,就是窃取别人的资源来构造自己。试想一下如果是数据量庞大的自定义类型,能够尽量减少拷贝,将会提高语言效率。

cpp 复制代码
//移动构造
xxx(xxx&& s)
{
	cout << "xxx(xxx&& s) -- 移动语义" << endl;
	swap(s);
    //例如直接交换指针的指向,因为右值一般生命周期快要结束了
    //就像武林高手临终前传授功力给主角,主角就减少了修炼成本
}
//移动赋值
xxx& operator=(xxx&& s)
{
	cout << "xxx& operator=(xxx&& s) -- 移动语义" << endl;
	swap(s);
	return *this;
}

4.完美转发

模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。

模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,

但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,

我们希望能够在传递过程中保持它的左值或者右值的属性, 就需要用我们下面学习的完美转发。

完美转发前:

完美转发后:

相关推荐
佳児素花痴╮10 分钟前
Qt速通2
开发语言·qt
“AI国潮设计-小江”33 分钟前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
529宝宝起名网42 分钟前
用 Python 分析汉字字源与起名用字的关联规律:从六书结构到文化寓意的起名偏好洞察
开发语言·python
汉克老师43 分钟前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程1 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6051 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝1 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
心态还需努力呀1 小时前
把 Flameshot 编译进鸿蒙 PC:一次 Qt C++ 截图工具的源码级移植实战
c++·qt·harmonyos
白色的北极熊2 小时前
c语言 输出菱形字符串
c语言·开发语言