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

相关推荐

  • 【初阶数据结构与算法】八大排序之非递归系列( 快排(使用栈或队列实现)、归并排序)

    * 文章目录 一、非递归版快排 1.使用栈实现非递归版快排 2.使用队列实现非递归版快排 二、非递归版归并排序 1.非递归版归并排序的实现 一、非递归版快排 1.使用栈实现非递归版快排 在学习非递归版快排前,建议大家先学习递归版的快排,否则非递归版的快排将很难理解,这里附上本人写的快排的博客解析:【初阶数据结构与算法】八大排序算法之交换排序(冒泡排序,快速排…

    2025 年 1 月 11 日
    56000
  • Claude Pro代充无需国外信用卡教程自己账号

    Claude Pro代充无需国外信用卡教程自己账号,适合国内用户使用微信支付宝为自己的账号完成Claude Pro充值、订阅或代充开通。

    未分类 2026 年 8 月 5 日
    16300
  • Grok Super国内支付充值完整教程

    国内用户开通 Grok Super 的充值教程,整理 Grok 充值、代充、国内支付、账号 ID 获取和确认充值步骤。

    未分类 2026 年 6 月 10 日
    30200
  • 架构-初识BFF

    引言 晚上公司开了一个技术分享会,主要内容就是公司的项目架构,会中讲解了项目整体架构是BFF架构,就是在微服务之上多加了一层。 除此之外,还讲解了DDD设计思想,主要用于各个业务中台,如订单中台、用户中台等。 这是我的架构第一课,听得有些似懂非懂,于是浅浅地整理一下。 BFF 是什么 BFF是服务于前端的后端,全称Backend For Frontend。B…

    2025 年 1 月 1 日
    63800
  • ChatGPT国内可以用吗?能不能用、怎么开通Plus

    ChatGPT国内可以用吗?2026 年国内用户照样能用 ChatGPT,账号注册、免费版使用和开通 Plus 都有现成的路。本文说清国内使用需要准备什么、免费版和 Plus 在国内的实际体验,以及用支付宝微信开 Plus 的方法。

    3天前
    9800

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信