左值引用(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.rhkb.cn/news/505782.html

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

相关文章

基于Springboot+Vue的仓库管理系统

开发一个基于Spring Boot和Vue的仓库管理系统涉及到前端和后端的开发。本文呢&#xff0c;给出一个简单的开发步骤指南&#xff0c;用于指导初入的新手小白如何开始构建这样一个系统&#xff0c;如果**你想直接学习全部内容&#xff0c;可以直接拉到文末哦。** 开始之前呢给小…

快速导入请求到postman

1.确定请求&#xff0c;右键复制为cURL(bash) 2.postman菜单栏Import-Raw text&#xff0c;粘贴复制的内容保存&#xff0c;请求添加成功

预训练语言模型——BERT

1.预训练思想 有了预训练就相当于模型在培养大学生做任务&#xff0c;不然模型初始化再做任务就像培养小学生 当前数据层面的瓶颈是能用于预训练的语料快被用完了 现在有一个重要方向是让机器自己来生成数据并做微调 1.1 预训练&#xff08;Pre - training&#xff09;vs. 传…

数字孪生电网有什么作用?实时云渲染技术又如何赋能智慧电网?

电网系统的结构比较复杂&#xff0c;传统运维模式主要是依赖传感器和人工巡检&#xff0c;难以全面监测管理。而数字孪生技术的应用将推动电网智能化、绿色化的高效转型。 智慧电网利用物理模型、现场测量数据和历史数据&#xff0c;结合云计算、物联网、大数据等技术&#xf…

MiniMind - 从0训练语言模型

文章目录 一、关于 MiniMind &#x1f4cc;项目包含 二、&#x1f4cc; Environment三、&#x1f4cc; Quick Start Test四、&#x1f4cc; Quick Start Train0、克隆项目代码1、环境安装2、如果你需要自己训练3、测试模型推理效果 五、&#x1f4cc; Data sources1、分词器&am…

EasyCVR视频汇聚平台如何配置webrtc播放地址?

EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持多协议接入&#xff0c;能将接入到视频流转码为多格式进行分发&#xff0c;包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…

【GlobalMapper精品教程】093:将tif影像色彩映射表(调色板)转为RGB全彩模式

参考阅读:【ArcGIS微课1000例】0137:色彩映射表转为RGB全彩模式 文章目录 一、Globalmapper中显示模式二、ArcGIS中显示模式三、调色板转为RGB全彩模式四、注意事项一、Globalmapper中显示模式 Globalmapper中,将谷歌等多种来源在线影像下载到本地后,可能会遇到以下数据格…

Postman接口测试05|实战项目笔记

目录 一、项目接口概况 二、单接口测试-登录接口&#xff1a;POST 1、正例 2、反例 ①姓名未注册 ②密码错误 ③姓名为空 ④多参 ⑤少参 ⑥无参 三、批量运行测试用例 四、生成测试报告 1、Postman界面生成 2、Newman命令行生成 五、token鉴权&#xff08;“…

【css】浏览器强制设置元素状态(hover|focus……)

直接上步骤&#xff1a; 打开浏览器控制台 → 找到样式选项 → 找到:hov选项 → 点击:hov选项&#xff0c;会展开【设置元素状态】。 只要选中就会展示出自己写在css里面的该种状态下的样式了。

Springboot——钉钉(站内)实现登录第三方应用

文章目录 前言准备1、创建钉钉应用&#xff0c;并开放网页应用2、配置网页应用各项参数发布版本 前端改造后端逻辑1、获取应用免登录 Access_token2、通过免登录 Access_token 和 Auth_Code 获取对应登录人信息 注意事项 前言 PC端的钉钉中工作台&#xff0c;增加第三方应用&a…

完美解决VMware 17.0 Pro安装ubuntu、Deepin等虚拟机后卡顿、卡死问题

这两天在 VM 17 Pro 中安装了ubuntu 24.1 和Deepin 23.9 等Linux操作系统&#xff0c;在使用过程中出现过数次卡顿、卡死问题&#xff0c;现记录整理解决方法如下&#xff1a; 一、问题描述 安装虚拟机时、以及安装完成后正常使用时出现鼠标点击卡顿、系统反应慢、卡死等问题…

计算机的错误计算(二百零七)

摘要 利用两个数学大模型计算 arccot(0.125664e2)的值&#xff0c;结果保留16位有效数字。 实验表明&#xff0c;它们的输出中分别仅含有3位和1位正确数字。 例1. 计算 arccot(0.125664e2)的值&#xff0c;结果保留16位有效数字。 下面是与一个数学解题器的对话。 以上为与…

Linux内核TTY子系统有什么(6)

接前一篇文章&#xff1a;Linux内核TTY子系统有什么&#xff08;5&#xff09; 本文内容参考&#xff1a; Linux TTY子系统框架-CSDN博客 一文彻底讲清Linux tty子系统架构及编程实例-CSDN博客 linux TTY子系统(3) - tty driver_sys tty device driver-CSDN博客 Linux TTY …

03_Redis基本操作

1.Redis查询命令 1.1 官网命查询命令 为了便于学习Redis,官方将其用于操作不同数据类型的命令进行了分类整理。你可以通过访问Redis官方网站上的命令参考页面https://redis.io/commands来查阅这些分组的命令,这有助于更系统地理解和使用Redis的各项功能。 1.2 HELP查询命令…

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

kubernetes第七天

1.影响pod调度的因素 nodeName 节点名 resources 资源限制 hostNetwork 宿主机网络 污点 污点容忍 Pod亲和性 Pod反亲和性 节点亲和性 2.污点 通常是作用于worker节点上&#xff0c;其可以影响pod的调度 语法&#xff1a;key[value]:effect effect:[ɪˈfek…

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. 这里面告诉我…

maven高级(day15)

Maven 是一款构建和管理 Java 项目的工具 分模块设计与开发 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多 个模块进行开发。 分模块设计我们在进行项目设计阶段&#xff0c;就可以将一个大的项目拆分成若干…

【json】

JSON JSON是一种轻量级的,按照指定的格式去组织和封装数据的数据交互格式。 本质上是一个带有特定格式的字符串(py打印json时认定为str类型) 在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互,类似于计算机普通话 python与json关系及相互转换…

计算机网络 笔记 数据链路层 2

1,信道划分&#xff1a; (1)时分复用TDM 将时间等分为“TDM帧”&#xff0c;每个TDM帧内部等分为m个时隙&#xff0c;m个用户对应m个时隙 缺点&#xff1a;每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据&#xff0c;那么就会在这个时间信道被闲置&#xff0c;利用…