【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 日

相关推荐

  • Grok Super开通会员代充流程

    国内用户开通Grok Super和SuperGrok的代充教程文章,说明Grok充值、Grok代充、卡密验证和账号ID确认流程。

    未分类 2026 年 6 月 3 日
    3800
  • JavaScript 延迟加载的方法( 7种 )

    JavaScript脚本的延迟加载(也称为懒加载)是指在网页的主要内容已经加载并显示给用户之后,再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度,改善用户体验,并减少服务器的压力。 以下是几种常见的延迟加载JavaScript的方法: defer 属性: 使用 async 属性: async 属性告诉浏览器立即开始下载脚本,并且在…

    2025 年 1 月 19 日
    62000
  • WxPython跨平台开发框架之图标选择界面

    在使用 wxPython 开发跨平台桌面应用程序时,创建一个图标选择界面 通常用于让用户从图标资源库中选择图标,我们可以把图标分为自定义的图标资源和系统的图标资源两大类,最终我们把它们整合一起使用,在框架的界面中使用,包括工具栏、右键菜单、按钮、图片等所需的地方显示,实现图文并茂的友好界面展示。本篇随笔介绍这两种图标资源的管理和使用过程。 1、图标分类介绍 …

    2025 年 1 月 1 日
    57800
  • 2026国内升级 ChatGPT Plus 充值攻略

    2026国内升级 ChatGPT Plus 充值攻略。围绕 ChatGPT Plus 充值、GPT 代充、支付宝微信开通、订阅续费和支付失败处理,整理实用流程。

    未分类 2026 年 5 月 17 日
    6900
  • Spring Boot实战:高效实现Excel导出与邮件异步推送方案

    基于Spring Boot框架的Excel数据导出与邮件自动发送技术实践一、项目背景在开发跑团管理系统过程中,我们遇到了一个典型的数据分发需求:需要将用户查询的团队信息和运动数据自动导出为Excel格式,并通过邮件系统直接推送给用户,避免手动下载的繁琐操作。技术挑战主要包括:- 数据导出与邮件发送耗时过长,严重影响接口响应速度- QQ邮箱服务对发件人身份验证…

    2025 年 5 月 11 日
    52800

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信