【C++】右值引用全面揭秘:解锁 C++11 的性能革命与移动语义奥秘!

文章目录

C++11 引入了右值引用,这是 C++ 语言的一个重要特性,其目的是为了提高程序的性能,尤其是在对象的传递和资源管理方面。与左值引用相比,右值引用解决了在传返回值时的不足,显著减少了不必要的拷贝,提高了效率。

右值和左值的基本概念

在 C++ 中,表达式的值可以分为左值和右值两种类型:

  • 左值:表示一个持久存在的对象或者内存位置,通常在赋值语句的左侧出现,并且具有可以取地址的特性。例如:变量、数组元素、解引用等都是左值。
//以下均是左值
//变量
int a = 3;
int* pa = &a;
const int b = a;
int* ptr = new int(3);

//解引用
*ptr = 4;

//数组元素
string str("abcdef");
str[0];
  • 右值:表示临时对象、字面量常量或者表达式的结果,通常只能出现在赋值语句的右侧,具有不可取地址的特性。右值是没有名称的、即将被销毁的对象。
int a = 4, b = 5;

//以下均是右值
100;
a + b;
fmin(x, y);
string("qwer");

左值引用和右值引用

引用本质上是给对象取别名,右值引用就是给右值取别名左值引用就是给左值取别名右值引用左值引用在语法形式上是类似的:

Type& ref = x;  //左值引用

Type&& rref = y;  //右值引用

可以看到,左值引用使用 &,而右值引用使用 &&

//左值
int a = 3;
int* pa = &a;
const int b = a;
int* ptr = new int(3);

//左值引用
int& ra = a;
int*& rpa = pa;
const int& rb = b;
int* rptr = ptr;
int a = 4, b = 5;
//右值
//100;
//a + b;
//fmin(x, y);
//string("qwer");

//右值引用
int&& rr1 = 100;
int&& rr2 = a + b;
int&& rr3 = fmin(a, b);
string&& rr4 = string("qwer");

对右值引用的理解:右值本质上是一种生命周期很短的对象(将亡值),而右值引用实际上是将该对象的地址保存,该对象就不会立即销毁,延长了生命周期。

一般而言,右值引用只能引用右值,左值引用只能引用左值,但在特殊情况下,右值引用可以引用左值,左值引用也可以引用右值。

  • 左值引用去引用右值:需要在前面加 const 修饰。
  • 右值引用去引用左值:需要对左值进行 move
//左值引用去引用右值,需要加const
const int& r1 = 10;
const string& r2 = string("abcd");

//右值引用求引用左值,需要对左值move
int x = 3;
int&& rr1 = move(x);
string str("1234");
string&& rr2 = move(str);

左值引用在特定条件下可以引用右值,这一点在前面其实也有所涉及,之前模拟实现容器(如 vector、list等)的 push_back 函数:void push_back (const T& x),加 const 是为了让 x 既能接收左值也能接收右值。

move 本质上就是强制类型转换,不会改变左值对象本身的属性。

template 
typename remove_reference::type&& move (T&& arg) noexcept;
{
    return static_cast::type&&>(arg)
}

右值引用的主要用途

在右值

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4603.html

(0)
LomuLomu
上一篇 2024 年 12 月 28 日
下一篇 2024 年 12 月 28 日

相关推荐

  • 2025 年最好的谷歌地图数据采集软件推荐

    2024 年,谷歌地图抓取已成为企业和研究人员的一大变革。凭借不断更新的餐厅、酒店、药店等数据库,谷歌地图提供了大量信息。通过使用正确的谷歌地图抓取工具,您可以解锁有价值的见解,以进行潜在客户生成、市场研究和竞争分析。最好的谷歌地图抓取工具使您能够自动收集数据,节省时间和资源,同时确保准确性。无论您是想分析竞争对手还是扩大客户群,这些工具都能为您提供成功所需…

    未分类 2025 年 1 月 6 日
    47800
  • 【Java】:lambda 表达式

    📃个人主页:island1314 🔥个人专栏:java学习 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 背景 🚀 🔥 Lambda 表达式 是JDK8新增的特性,Lambda 表达式 可以取代大部分匿名内部类,写出更优雅的Java代码,尤其在集合的遍历和其他集合操作中,可以将函数作为一个方法的参数,也就是函数作为参数传递到方法中,极大地优化代…

    2024 年 12 月 30 日
    43800
  • 华为OD机试E卷 –考勤信息–24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 公司用一个字符串来表示员工的出勤信息• absent:缺勤• late:迟到• leaveearly:早退• present:正常上班现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:• 缺…

    未分类 2024 年 12 月 28 日
    74100
  • [华为OD机考 – 密语传递 – 基于深度优先搜索的Java实现(2025 A卷 200分)]

    华为2025届OD机考A卷试题库持续更新中,专项练习 _ 戳此进入_ 专题导览 本系列试题已编入《华为OD机考Java真题全集(A/B/C/D/E卷)》。练习频次与中签率正相关, 添加哪吒微信,备注”华为OD备考”,加入专属刷题群 ,每道题配备:解题思路解析、完整代码实现、多组测试数据、算法选择依据、应用场景说明,题库实时更新,24小时在线答疑。 题目要求 …

    2025 年 5 月 12 日
    22000
  • Java中的包管理、抽象类与接口详解

    目录包的概念与应用包的导入方式静态导入特性类的包管理常用系统包介绍抽象类解析定义规范使用要点核心价值接口详解多接口实现接口继承关系实际应用案例方法一:Comparable接口实现方法二:Comparator比较器应用Clonable接口与深度复制抽象类与接口对比 包的概念与应用 在Java编程中,包(package)是组织代码结构的重要机制,其主要作用是确保…

    2025 年 5 月 19 日
    22000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信