左值引用(Lvalue Reference)和右值引用(Rvalue Reference)详解

左值引用(Lvalue Reference)和右值引用(Rvalue Reference)详解

文章目录

  • 左值引用(Lvalue Reference)和右值引用(Rvalue Reference)详解
    • 1. 什么是左值和右值?
      • 左值(Lvalue)
      • 右值(Rvalue)
    • 2. 左值引用(`T&`)
      • 左值引用的定义
      • 特点
    • 3. 右值引用(`T&&`)
      • 右值引用的定义
      • 特点
    • 4. 左值引用和右值引用的对比
    • 5. 结合使用左值引用和右值引用
      • 示例:函数重载
    • 6. 常见使用场景
      • 6.1. 移动语义
      • 6.2. 完美转发
    • 7. 总结

C++ 中的 引用(Reference) 是变量的别名,分为两种:

  1. 左值引用(Lvalue Reference):T&
    • 用于绑定到左值。
    • 可以读取或修改绑定的对象。
  2. 右值引用(Rvalue Reference):T&&
    • 用于绑定到右值。
    • 通常用于转移资源(实现移动语义)或延长右值的生命周期。

1. 什么是左值和右值?

左值(Lvalue)

左值是指 在程序中有持久存储地址的对象。通常:

  • 左值可以被取地址(& 操作符)。
  • 左值可以出现在赋值语句的左侧。

示例:

int x = 10;  // x 是左值,存储在内存中,有地址
x = 20;      // 可以修改左值

右值(Rvalue)

右值是指 临时对象或没有存储地址的值。通常:

  • 右值不能被取地址(& 操作符无效)。
  • 右值通常是表达式的结果或字面值(如 42)。

示例:

int y = 42;       // 42 是右值,不能取地址
int z = x + 10;   // x + 10 是右值,计算结果的临时对象

2. 左值引用(T&

左值引用的定义

  • 左值引用(T&)是绑定到左值的一种引用。
  • 它是左值的别名,可以通过引用对原对象进行修改。

语法:

int x = 10;       // 左值
int& ref = x;     // ref 是 x 的引用
ref = 20;         // 修改 ref 等同于修改 x

特点

  1. 左值引用只能绑定到左值。
  2. 引用本身不是对象,没有地址。

示例:

#include <iostream>
using namespace std;int main() {int x = 10;int& ref = x;       // ref 是 x 的左值引用ref = 20;           // 修改 ref 等于修改 xcout << x << endl;  // 输出: 20return 0;
}

3. 右值引用(T&&

右值引用的定义

  • 右值引用(T&&)是绑定到右值的一种引用。
  • 它可以延长右值的生命周期,允许在右值上执行操作。

语法:

int&& ref = 42;  // ref 是右值引用,绑定到右值 42

特点

  1. 右值引用只能绑定到右值。
  2. 用于延长临时对象的生命周期。
  3. 常见于移动语义和完美转发。

示例:延长右值生命周期

#include <iostream>
using namespace std;int main() {int&& ref = 42;       // ref 是右值引用,绑定到临时对象 42cout << ref << endl;  // 输出: 42ref = 100;            // 修改 ref,也修改了临时对象cout << ref << endl;  // 输出: 100return 0;
}

4. 左值引用和右值引用的对比

特性左值引用(T&右值引用(T&&
绑定对象类型左值右值
是否延长生命周期
用途用于修改左值用于移动语义、优化性能、延长右值生命周期
示例int& ref = x;int&& ref = 42;

5. 结合使用左值引用和右值引用

C++11 引入右值引用后,开发者可以通过重载实现更高效的操作。

示例:函数重载

#include <iostream>
using namespace std;// 左值引用版本
void process(int& x) {cout << "左值引用: " << x << endl;
}// 右值引用版本
void process(int&& x) {cout << "右值引用: " << x << endl;
}int main() {int a = 10;process(a);     // 调用左值引用版本process(42);    // 调用右值引用版本process(a + 1); // 调用右值引用版本return 0;
}

输出

左值引用: 10
右值引用: 42
右值引用: 11

6. 常见使用场景

6.1. 移动语义

右值引用常用于转移资源,避免拷贝,提高性能。

示例:右值引用和 std::move

#include <iostream>
#include <vector>
#include <utility> // std::move
using namespace std;int main() {vector<int> vec1 = {1, 2, 3};vector<int> vec2 = std::move(vec1); // 转移 vec1 的资源到 vec2cout << "vec1 size: " << vec1.size() << endl; // 输出: 0cout << "vec2 size: " << vec2.size() << endl; // 输出: 3return 0;
}

6.2. 完美转发

右值引用结合模板,用于实现完美转发。

示例:完美转发

#include <iostream>
using namespace std;void process(int& x) {cout << "左值引用: " << x << endl;
}void process(int&& x) {cout << "右值引用: " << x << endl;
}template <typename T>
void forward_to_process(T&& arg) {process(std::forward<T>(arg)); // 保持原始的左值或右值属性
}int main() {int a = 10;forward_to_process(a);    // 左值引用forward_to_process(42);   // 右值引用return 0;
}

7. 总结

特性左值引用(T&右值引用(T&&
绑定的对象左值右值
用途修改左值延长右值生命周期、实现移动语义
性能需要拷贝数据避免拷贝,直接转移资源
使用场景常规引用操作移动语义、完美转发、高效处理临时对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索数据存储的奥秘:深入理解B树与B+树

key value 类型的数据红黑树&#xff08;最优二叉树&#xff0c;内存最优&#xff09;&#xff0c;时间复杂度&#xff1a;O&#xff08;logn&#xff09;,调整方便&#xff1b;一个结点分出两个叉B树一个节点可以分出很多叉数据量相等的条件下&#xff1a;红黑树的层数很高&am…

联邦大语言模型典型系统: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHub

联邦大语言模型典型系统: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHub 目录 联邦大语言模型典型系统: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHubPEFT 技术及简单举例PEFT 技术代码实现提示词工程不仅仅在聊天对话框实现,还可以再代码中实现联邦大语言模…

L1G5000 XTuner 微调个人小助手认知

使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知 1 环境配置与数据准备步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境步骤 1. 安装 XTuner 修改提供的数据步骤 0. 创建一个新的文件夹用于存储微调数据步骤 1. 创建修改脚本步骤 2. 执行脚本步骤 3. 查看数据…

网络协议安全的攻击手法

1.使用SYN Flood泛洪攻击&#xff1a; SYN Flood(半开放攻击)是最经典的ddos攻击之一&#xff0c;他利用了TCP协议的三次握手机制&#xff0c;攻击者通常利用工具或控制僵尸主机向服务器发送海量的变源端口的TCP SYN报文&#xff0c;服务器响应了这些报文后就会生成大量的半连…

Excel 技巧08 - 如何计算某类(比如红色背景色)单元格的总和? (★)

本文讲了如何在Excel中计算某类(比如红色背景色)单元格的总和。 1&#xff0c;如何计算某类(比如红色背景色)单元格的总和&#xff1f; 技巧就是先把它们给标记出来&#xff0c;然后就好统计了。 那么如何找出来呢&#xff1f; 对&#xff0c;就是通过红色。 按下Ctrl F 点…

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

移远BC28_opencpu方案_pin脚分配

先上图&#xff0c;BC28模块的pin脚如图所示&#xff1a; 下面看看GPIO的复用管脚 然后我自己整理了一份完整的pin功能列表

深度学习笔记11-优化器对比实验(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…

FFmpeg Muxer HLS

使用FFmpeg命令来研究它对HLS协议的支持程度是最好的方法&#xff1a; ffmpeg -h muxerhls Muxer HLS Muxer hls [Apple HTTP Live Streaming]:Common extensions: m3u8.Default video codec: h264.Default audio codec: aac.Default subtitle codec: webvtt. 这里面告诉我…

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…

Node.js——fs(文件系统)模块

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Microsoft Azure Cosmos DB:全球分布式、多模型数据库服务

目录 前言1. Azure Cosmos DB 简介1.1 什么是 Azure Cosmos DB&#xff1f;1.2 核心技术特点 2. 数据模型与 API 支持2.1 文档存储&#xff08;Document Store&#xff09;2.2 图数据库&#xff08;Graph DBMS&#xff09;2.3 键值存储&#xff08;Key-Value Store&#xff09;…

2025年华为OD上机考试真题(Java)——整数对最小和

题目&#xff1a; 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c;并对取出的所有元素求和&#xff0c;计算和的最小值。 注意&#xff1a;两对元素如果对应…

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构&#xff0c;然后再介绍世面上常见的产品 我们在大型的复杂的系统下&#xff0c;会有大量的跑批&#xff0c;定时任务的功能&#xff0c;如果在独立的子项目中单独去处理这些任务&#xff0c;随着业务的复杂度的提高…

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法

网络安全 | 网络安全法规&#xff1a;GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》&#xff08;GDPR&#xff09;2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》&#xff08;CCPA&#xff09;3.1 背景3.2 主要内…

“AI智能陪练培训服务系统,让学习更轻松、更高效

大家好&#xff0c;我是资深产品经理小李&#xff0c;今天咱们来侃侃一个新兴的教育辅助工具——AI智能陪练培训服务系统。这个系统可谓是教育培训行业的一股新势力&#xff0c;它究竟有什么神奇之处呢&#xff1f;下面我就跟大家伙儿好好聊聊。 一、什么是AI智能陪练培训服务系…

notebook主目录及pip镜像源修改

目录 一、notebook主目录修改二、pip镜像源修改 一、notebook主目录修改 在使用Jupyter Notebook进行数据分析时&#xff0c;生成的.ipynb文件默认会保存在Jupyter的主目录中。通常情况下&#xff0c;系统会将Jupyter的主目录设置为系统的文档目录&#xff0c;而文档目录通常位…

如何利用百炼智能体编排应用轻松搭建智能AI旅游助手?

各位小伙伴儿&#xff0c;好哈&#xff01; 在上一篇文章《5分钟基于阿里云百炼平台搭建专属智能AI机器人》中我们体验了如何利用阿里云百炼平台的智能体应用搭建专属智能机器人。 它的配置过程相对简单&#xff0c;其“对话式”的输出形式也十分直观&#xff0c;非常适合初学…

计算机视觉目标检测-DETR网络

目录 摘要abstractDETR目标检测网络详解二分图匹配和损失函数 DETR总结总结 摘要 DETR&#xff08;DEtection TRansformer&#xff09;是由Facebook AI提出的一种基于Transformer架构的端到端目标检测方法。它通过将目标检测建模为集合预测问题&#xff0c;摒弃了锚框设计和非…