当前位置: 首页 > news >正文

C++ 左值右值

文章目录

  • 概述
    • 左值
    • 右值
    • 右值引用
    • 左值和右值的互换
  • 小结

概述

左值和右值属于2中不同的表达式类型;它们在表达式中扮演不同的角色,特别是在赋值操作和函数参数传递中。

左值

定义:左值是指那些在内存中有确定位置的表达式,可以出现在赋值表达式的左侧,即可以被赋值。
特征:
左值可以出现在赋值操作的左侧,也可以出现在函数的参数中(如果函数参数是引用类型)。

关键点:表达式左边,可以被赋值可以推导出来;函数参数+参数是引用类型

右值

==定义:右值是指那些没有存储在内存中,或者没有持久存储位置的表达式。==它们通常表示临时值或字面量。
特征:右值通常不能出现在赋值操作的左侧,但C++11引入了右值引用(rvalue reference),允许右值出现在赋值操作的左侧,并且可以用于实现移动语义(move semantics)。

关键点:右值一般在表达式右边。

右值引用

定义:C++11引入了右值引用,用双写的&&表示,它允许程序员更有效地处理右值。
用途:

  1. 移动语义:允许临时对象的资源被“移动”到另一个对象中,而不是进行复制。一般用std::move来实现
  2. 完美转发:在模板编程中,可以转发参数的值类别(左值或右值)。 这个一般用std::forward来实现

示例1(移动语义):

#include <iostream>
#include <vector>class ResourceHolder {
public:ResourceHolder(int size) : data(new int[size]) {std::cout << "ResourceHolder created with size " << size << std::endl;}~ResourceHolder() {std::cout << "ResourceHolder destroyed" << std::endl;delete[] data;}// Move constructorResourceHolder(ResourceHolder&& other) {data = other.data;other.data = nullptr;}// Copy constructor (deleted)ResourceHolder(const ResourceHolder&) = delete;// Move assignment operatorResourceHolder& operator=(ResourceHolder&& other) {if (this != &other) {delete[] data;data = other.data;other.data = nullptr;}return *this;}// Copy assignment operator (deleted)ResourceHolder& operator=(const ResourceHolder&) = delete;private:int* data;
};int main() {ResourceHolder largeResource(1024);std::vector<ResourceHolder> resources;// 使用 std::move 将 largeResource 移动到 vector 中resources.push_back(std::move(largeResource));// largeResource 现在是一个空的 ResourceHolder 对象return 0;
}

示例1(完美转发):

#include <utility>
#include <iostream>// 假设这是我们要转发参数的目标函数
void process(int& i) {std::cout << "process(int&) called with " << i << std::endl;
}void process(int&& i) {std::cout << "process(int&&) called with " << i << std::endl;
}// 模板函数,使用 std::forward 来转发参数
template<typename T>
void wrapper(T&& arg) {process(std::forward<T>(arg));
}int main() {int a = 5;wrapper(a);  // a 是左值,调用 process(int& i)wrapper(10); // 10 是右值,调用 process(int&& i)
}

左值和右值的互换

常量左值:通过const关键字可以创建一个常量左值,它不能被赋值。
右值转换为左值:通过赋值操作,右值可以转换为左值。例如,int &&a = 10; 这里的10是一个右值,但通过赋值操作,a成为了一个左值引用。

小结

本篇主要写了一个新的概念,右值引用;左值右值是一直存在的,只不过引入了一个右值引用,然后多了一个左值转成右值(一般用std::move),还多了一个完美转发(一般用std::forward)。例子仅供参考,理解概念使用。还是先把概念搞明白,然后才好理解;感兴趣可以一起学习学习。概念这东西,很多人都不喜欢,却都逃不掉,多看几遍就好了。OK,翻篇。

相关文章:

C++ 左值右值

文章目录 概述左值右值右值引用左值和右值的互换 小结 概述 左值和右值属于2中不同的表达式类型&#xff1b;它们在表达式中扮演不同的角色&#xff0c;特别是在赋值操作和函数参数传递中。 左值 定义&#xff1a;左值是指那些在内存中有确定位置的表达式&#xff0c;可以出…...

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…...

[深度学习] 卷积神经网络CNN

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理数据具有类似网格结构的神经网络&#xff0c;最常用于图像数据处理。 一、CNN的详细过程&#xff1a; 1. 输入层 输入层接收原始数据&#xff0c;例如一张图像&#xff0c;它可以被…...

区别QPushButton和QToolButton

在刚开始学习Qt时,可能很难理解QPushButton和QToolButton之间的区别。 QToolButton通常用于QToolBar中,常常只显示图标,而不显示文本。那么,它们的主要区别是什么?什么时候应该使用QPushButton,什么时候应该使用QToolButton? 了解这一点很重要,这样我们才能选择最合适…...

【Python】已解决:TypeError: Object of type JpegImageFile is not JSON serializable

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;TypeError: Object of type JpegImageFile is not JSON serializable 一、分析问题背景 在进行Python编程时&#xff0c;特别是处理图像数据和JSON序列化时&…...

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…...

Python面试宝典第1题:两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;找出数组中和为目标值的两个数的索引。可以假设每个输入只对应唯一的答案&#xff0c;且同样的元素不能被重复利用。比如&#xff1a;给定 nums [2, 7, 11, 15] 和 target 9&#xff0c;返回 [0, 1]&#xff0c;因…...

fastapi集成jwt

fastapi集成jwt fastapipython-jose实现jwt登录 1、安装相关包 python-jose pip install python-jose2、创建token及token校验 from copy import deepcopy from datetime import timedelta, datetimefrom jose import jwt, ExpiredSignatureErrorSECRET_KEY "xxx&quo…...

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…...

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说&#xff0c;从iOS设备恢复数据都是一项复杂的任务&#xff0c;因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到&#xff0c;例如分析…...

macOS 上或linux安装 Jenkins

在 macOS 上使用 Docker 安装 Jenkins 的步骤如下&#xff1a; 安装 Docker: 如果尚未安装 Docker&#xff0c;请先从 Docker 官网下载并安装 Docker Desktop for Mac。 打开终端: 打开 macOS 上的终端应用程序。 拉取 Jenkins 镜像: 使用以下命令从 Docker Hub 拉取 Jenkins…...

axios发送数据的几种方式

axios 发送数据的几种方式 1、最简单的方式是将参数直接拼接在 URL 上&#xff0c;这通常用于传递少量的数据&#xff0c;例如资源的 ID。 const id 12; axios.delete(https://api.example.com/${id}).then(response > {console.log(Resource deleted successfully:, res…...

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…...

离线安装kubesphere-详细操作,以及报错

离线安装kubesphere 官网地址 https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/air-gapped-installation/ 1.先准备docker环境 [rootnode1 ~]# tar -xf docker-24.0.6.tgz [rootnode1 ~]# ls anaconda-ks.cfg calico-v3.26.1.tar docker …...

Python Coala库:代码质量检查与自动化修复的利器

更多Python学习内容&#xff1a;ipengtao.com 在软件开发过程中&#xff0c;代码质量至关重要。高质量的代码不仅易于维护和扩展&#xff0c;还能减少错误和提升效率。为了确保代码质量&#xff0c;我们常常需要依赖代码分析工具。Python的Coala库就是这样一个强大的工具&#…...

MyBatis(12)MyBatis 映射文件中的 resultMap

MyBatis 的 resultMap 是一种高级映射策略&#xff0c;用于处理复杂的SQL查询结果和Java对象之间的映射关系。resultMap 提供了比 auto-mapping 更为灵活的映射方式&#xff0c;它允许开发者显式指定数据库列和Java对象属性之间的映射关系&#xff0c;甚至可以处理复杂的数据结…...

C语言从入门到进阶(15万字总结)

前言&#xff1a; 《C语言从入门到进阶》这本书可是作者呕心沥血之作&#xff0c;建议零售价1元&#xff0c;当然这里开个玩笑。 本篇博客可是作者之前写的所有C语言笔记博客的集结&#xff0c;本篇博客不止有知识点&#xff0c;还有一部分代码练习。 有人可能会问&#xff…...

Java---Maven详解

一段新的启程&#xff0c; 披荆斩棘而前&#xff0c; 心中的梦想&#xff0c; 照亮每个黑暗的瞬间。 无论风雨多大&#xff0c; 我们都将坚强&#xff0c; 因为希望的火焰&#xff0c; 在胸中永不熄灭。 成功不是终点&#xff0c; 而是每一步的脚印&#xff0c; 用汗水浇灌&…...

服务器日志事件ID4107:从自动更新 cab 中提取第三方的根目录列表失败,错误为: 已处理证书链,但是在不受信任提供程序信任的根证书中终止。

在查看Windows系统日志时&#xff0c;你是否有遇到过事件ID4107错误&#xff0c;来源CAPI2&#xff0c;详细信息在 http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab 从自动更新 cab 中提取第三方的根目录列表失败&#xff0c;…...

【高级篇】MySQL集群与分布式:构建弹性和高效的数据服务(十四)

引言 在探讨了《分区与分片》策略后,我们已经学会了如何在单一数据库层面有效管理大量数据和提升查询效率。本章,我们将踏上更高层次的探索之旅,深入MySQL集群与分布式技术的广阔领域。这些技术不仅能够横向扩展系统的处理能力和存储容量,还能显著增强数据服务的可靠性和响…...

终极指南:如何用DroidCam OBS插件将手机变成专业直播摄像头

终极指南&#xff1a;如何用DroidCam OBS插件将手机变成专业直播摄像头 【免费下载链接】droidcam-obs-plugin DroidCam OBS Source 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam-obs-plugin 想要将手机摄像头变成OBS直播的高清视频源吗&#xff1f;DroidCam …...

Allegro中Route Keepout、Design Outline和Cutout到底怎么用?一张图讲清PCB布局中的‘禁区’设置

Allegro中三大边界工具实战指南&#xff1a;Route Keepout、Design Outline与Cutout的精准运用 在PCB设计领域&#xff0c;边界定义如同城市规划中的红线&#xff0c;既决定了板卡的物理形态&#xff0c;又影响着电气性能的发挥。Cadence Allegro作为行业标准工具&#xff0c;提…...

5分钟完整指南:Sabaki围棋软件打造专业级对弈环境

5分钟完整指南&#xff1a;Sabaki围棋软件打造专业级对弈环境 【免费下载链接】Sabaki An elegant Go board and SGF editor for a more civilized age. 项目地址: https://gitcode.com/gh_mirrors/sa/Sabaki Sabaki是一款优雅的围棋棋盘和SGF编辑器&#xff0c;专为追求…...

别再只刷Demo了!手把手教你用CCS给AWR1843毫米波雷达写自己的‘大脑’

从Demo玩家到雷达开发者&#xff1a;AWR1843毫米波雷达CCS深度开发实战 毫米波雷达技术正在智能驾驶、工业检测等领域掀起革命浪潮。作为TI明星产品&#xff0c;AWR1843凭借其高性价比和丰富功能成为众多开发者的首选。但大多数用户止步于运行官方Demo&#xff0c;未能真正释放…...

独立开发者如何借助Taotoken模型广场快速选型与验证创意

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken模型广场快速选型与验证创意 对于独立开发者或小型团队而言&#xff0c;验证一个AI产品创意的核心挑战…...

保姆级教程:在Ubuntu 20.04上为ARM开发板(如RK3399)交叉编译Mesa图形库(含完整配置与库路径修复)

ARM开发板图形加速实战&#xff1a;RK3399平台Mesa交叉编译与深度优化指南 在嵌入式系统开发中&#xff0c;图形处理能力往往成为决定用户体验的关键因素。RK3399这类高性能ARM开发板搭载的Mali-T860 GPU&#xff0c;理论上能够提供出色的图形渲染性能&#xff0c;但要将这种潜…...

NotebookLM深度适配语言学研究全流程(附Linguistic Annotation Pipeline v2.1实测报告)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM语言学研究辅助的范式变革 从静态语料库到动态知识图谱的跃迁 NotebookLM 不再将语言学材料视为孤立文本&#xff0c;而是通过语义锚点&#xff08;Semantic Anchors&#xff09;自动识别术…...

终极指南:如何利用Awesome Public Datasets构建专业级数据科学项目

终极指南&#xff1a;如何利用Awesome Public Datasets构建专业级数据科学项目 【免费下载链接】awesome-public-datasets A topic-centric list of HQ open datasets. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-public-datasets 在当今数据驱动的时代…...

保姆级教程:用Python和go-cqhttp给QQ群做个自动回复机器人(附完整代码)

从零构建智能QQ群机器人&#xff1a;Python与go-cqhttp实战指南 在社群运营中&#xff0c;自动回复机器人早已成为提升管理效率的利器。无论是处理高频咨询、新人引导&#xff0c;还是定时发布公告&#xff0c;一个配置得当的机器人能显著减轻管理员负担。本文将带你深入探索如…...

OpenClaw开源安全平台:模块化架构、插件化设计与企业级自动化安全运营实践

1. 项目概述&#xff1a;从开源安全工具到企业级安全基线的构建最近在梳理内部安全工具链时&#xff0c;又仔细研究了一下AtlasPA/openclaw-security这个项目。这不仅仅是一个简单的漏洞扫描器或者安全脚本集合&#xff0c;它更像是一个试图将安全左移理念、自动化响应和资产安…...