C++左值引用与右值引用

0.类型和值类别的区别?

类型(type)和值类别(value category)

1.类型指的是数据类型,int,char这样的内置类型,类型主要是用来区别它们的字节大小。除了内置类型还有自定义类型,自定义类型中的类型还表征了结构,像C语言的结构体,由于结构(或者说内置类型的顺序)的不同引发的内存对齐问题。所以类型表征的是大小,结构。

2.值类别呢,就是关于变量的左右值属性

1.如何区分左值右值?

1.从高级语言的角度--能否被引用

如果能取地址,说明这个变量是左值,我们可以通过地址修改它,如果不能取地址,则变量是右值,我们不能通过地址修改它。

比如int num = 10;

将10存储到变量num中,num对应一个地址,后续可以通过地址修改num的值,所以我们称num为左值(num在表达式的左边,这是左的含义),表达式右边的10就是一个右值,我们无法通过10的地址修改10。

2.从高级语言的角度--值类别表征了数据的存储位置

从计算机体系结构的角度理解

int num = 10;

全新的理解是:num不是什么变量名,num对应了一个地址,是位于进程地址空间上的栈区的地址,int也不是什么类型,int表示从该地址往后8字节的空间被进程使用了,要以8字节为一个整体,修改该地址上的内容。

而10是一个字面常量,用二进制表示为00001010,根据赋值对象的不同再进行提升或截断,比如10要赋值给int对象,所以被提升为00000000 ... 00001010(前面多出7个全0的序列,每个序列有8个0),存储时再根据大小端字节序将这些字面值从代码区拷贝到刚才的栈区地址上。

这行代码被编译后会被放到进程地址空间的正文代码区,系统怎么知道你要用10初始化num?因为正文代码区的存储了10的二进制序列,代码区中还有10要放入的地址(没有什么num,只有一串地址),以及把10放到地址上的指令,这些信息都会在代码中表示。并且,程序的正文代码区也是有地址的,代码区存储系统要执行的指令。现在回头看右值的概念,不能取地址的就是右值,10有地址吗?当然有,没有地址系统怎么访问正文代码区,怎么知道你要初始化的值是10,所以不能取地址不是因为没有地址,而是因为这个地址你不能知道,地址位于只读数据区(代码区的数据可不能随便修改,当然是只读数据区)或者说该地址上的数据只有在程序运行后才会被系统读取,你要取地址,编译器直接出手,谁能保证你不会做一些危害系统安全的事,编译器可不会给你这些地址,于是程序编译失败。

总结:我认为只要数据位于的区域你没有权限访问,这些数据就是右值,你有权限访问的区域,存储的数据是左值。

2.将亡值

我们通常讨论的左值并不是gvalue(泛左值),而是lvalue,通常讨论的右值是rvalue,它包含了将亡值xvalue和纯右值pvalue,其中的将亡值与右值引用息息相关,匿名对象和函数返回值都是将亡值,它们都具有常属性,并且生命周期较短,在下一条语句执行前资源就会被释放。具体的比如隐式类型转换产生的中间变量,为了调用类的函数而定义的匿名对象,这些变量似乎都是工具人,被创建只是为了其他语句的成功执行

实例

左值

int x = 8;
int & func()
{return x;	//不能将临时变量以左值返回,这里返回个全局变量的引用
}func() = 10;	//func()返回的是左值,可以放在左边被赋值
printf("x = %d", x);	//10。修改的其实是x

右值

int func()
{int x = 9;return x;
}func() = 10;	//编译器报错
//你只能:
int y = func();	//func()返回的其实是临时变量,也就是右值,然后将这个右值赋给y(逻辑上可以这样理解没问题,编译器不一定按这个步骤来,请看示例二)

3.C++11右值引用

右值引用是右值吗 :右值引用不是右值,它是一个左值;

1.C++11右值分类

C++11中的右值可以分为两种:

1.纯右值:内置类型表达式的值

2.将亡值:自定义类型表达式的值:所谓的将亡值就是指声明周期马上就要结束 的值,一般来说匿名对象,临时对象,move后的自定义类型都可以看做将亡值、

2.左值引用与右值引用区别

左值引用:左值引用只能引用左值,不能引用右值。但是const左值引用既可引用左值,也可引用右值,因为 const左值引用也是只读的,而权限可以平移

int main()
{// 左值引用只能引用左值,不能引用右值。int a = 10;int& ra1 = a;    // ra为a的别名//int& ra2 = 10;   // 编译失败,因为10是右值// const左值引用既可引用左值,也可引用右值。const int& ra3 = 10;const int& ra4 = a;return 0;
}

右值引用只能右值,不能引用左值,但是右值引用可以move以后的左值。

int main()
{// 右值引用只能右值,不能引用左值。int&& r1 = 10;// error C2440: “初始化”: 无法从“int”转换为“int &&”// message : 无法将左值绑定到右值引用//int a = 10;//int&& r2 = a;// 右值引用可以引用move以后的左值int&& r3 = std::move(a);return 0;
}

2.右值引用的作用

 右值引用是C++11新特性,之所以引入右值引用,是为了提高效率。如下面所示:

class A
{
public:A(size_t N):m_p(new char[N]){}A(const A & a){if (this != &a){delete[]m_p;m_p = new char[strlen(m_p) + 1];memcpy(m_p, a.m_p, strlen(m_p) + 1);}}~A(){delete []m_p;}private:char *m_p = nullptr;
};A createA(size_t N)
{return A(100);
}void func(A a)
{//
}int main()
{func(createA(100));system("pause");return 0;
}

在查阅过程中发现一片讲的较为透彻的文章 ,想了解更具体的可以查看C++ / 左值、右值、将亡值 | 谈谈我对它们的深入理解 - 知乎 (zhihu.com)

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

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

相关文章

【ESP-BOX-LITE】:照片查看器

目录 项目场景: 项目需求描述: 项目技术: 项目成果: 项目总结: 项目视频: 芳香 项目场景: 使用ESP-BOX-LITE实现照片查看器功能,显示多级目录下的图片或文件夹,自…

二进制部署k8s

常见的K8S安装部署方式 ●Minikube Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。 部署地址:https://kubernetes.io/docs/setup/minikube ●Kubeadm Kubeadm也是一个工具,提供…

vue3中使用vue3-pdf-app和使用浏览器内置的PDF插件浏览器PDF文件

文章目录 先准备一个PDF使用浏览器内置的PDF插件预览PDF在HTML中使用浏览器插件预览PDFVscode使用插件发布服务后直接通过URL地址访问PDF可使用的浏览器 在vue3项目中预览PDF文件vue3项目也是可以通过URL地址访问文件的vue3中使用浏览器内置的PDF插件预览PDF代码如下所示&#…

京东数据分析:2023厨房小电市场遇冷,空气炸锅等明星产品被抛弃

过去几年间,宅经济的爆发带火了酸奶机、煮蛋器、豆浆机、空气炸锅、养生壶等,一众外观小巧、功能丰富、价格相对便宜的厨房小家电。但随着年轻人走出家门回归工作岗位,厨房小家电们却步入了艰难时刻。 如今,厨房小家电们似乎正在经…

blender怎么在一个面上对半切割(不影响别的面)

1进入编辑模式 2.在面选择模式下,选中该物体需要切割成两半的面。 3.按K这个快捷键(切记,必须得用快捷键,不用的话没办法调出第一个绿色切割点),将切割点移动到需要切割的起始边,按住Shift键不放…

第六节:Word中对象的层次结构

《VBA之Word应用》(10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实例让…

[Linux 基础] make、Makefile自动化构建代码工具

文章目录 1、make与Makefile是什么2、为什么要有make与Makefile3、怎么实现一个Makefile文件3.1 如何编写Makefile文件3.1.1 依赖关系3.1.2 依赖方法 3.2 如何清理项目3.2.1 如何编写3.2.2 clean详解 3.3 make的使用3.4 原理3.4.1 查看文件修改时间 1、make与Makefile是什么 m…

为什么索引要用B+树来实现呢,而不是B树

首先,常规的数据库存储引擎,一般都是采用 B 树或者 B树来实现索引的存储。 B树 因为 B 树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。 而对于数据库来说,所有…

Java日志系统之Logback

目录 Logback Logback的简单使用 Logback配置文件 log4j.peoperties转化为logback.xml Logback Logback的性能要比log4j要好。 Logback分为三个模块: logback-core:其他两个模块的基础模块logback-classic:它是log4j的一个改良版本&am…

小白也会的校园网宽带拨号自动重连设置

开始菜单搜索“任务计划程序”:我这个开始菜单和你们的不太一样,用了StartAllBack设置的,总之能找到这个程序就行了 提示:可以按下“Win R”,打开“运行”,输入taskschd.msc来打开任务计划程序 点击“任务…

最新咸鱼签名JS逆向分析教程

本章教程,主要分享一下咸鱼H5网页端sign签名算法。 案例地址:https://h5.m.goofish.com/item?id=744640763988 程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 目录 一、参数分析 二、逆向过程

浅谈 docker run 命令中的 -i -t 和 -d 选项

以 docker Ubuntu 镜像为例,ubuntu镜像启动时默认执行的命令是"/bin/bash"。 文章目录 不带任何选项带 -i 选项带 -i 和 -t 选项-d 选项 不带任何选项 rootubuntu20:~# docker run ubuntu:20.04 rootubuntu20:~# docker ps CONTAINER ID IMAGE …

【Unity地编细节】为什么Unity笔刷在地形上面刷不出来

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…

Linux:firewalld防火墙-基础使用(2)

上一章 Linux&#xff1a;firewalld防火墙-介绍&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/133960695?spm1001.2014.3001.5501 我使用的系统为centos7 firewalld启动停止等操作 systemctl start firewalld 开启防火墙 systemct…

There are not enough slots available in the system to satisfy the 48 slots报错

文章目录 问题描述解决办法 问题描述 多核运行时出现这个错误&#xff0c;减少核数运行正常 解决办法 输出命令 vim ~/.bashrc添加 alias mpirunmpirun --oversubscribe执行命令 source ~/.bashrc解决。

nginx安装详细步骤和使用说明

下载地址&#xff1a; https://download.csdn.net/download/jinhuding/88463932 详细说明和使用参考&#xff1a; 地址&#xff1a;http://www.gxcode.top/code 一 nginx安装步骤&#xff1a; 1.nginx安装与运行 官网 http://nginx.org/1.1安装gcc环境 # yum install gcc-c…

Power BI 傻瓜入门 1. 数据分析术语:Power BI风格

本章内容包括&#xff1a; 了解Power BI可以处理的不同类型的数据了解您的商业智能工具选项熟悉Power BI术语 数据无处不在。从你醒来的那一刻到你睡觉的时候&#xff0c;某个系统会代表你收集数据。即使在你睡觉的时候&#xff0c;也会产生与你生活的某些方面相关的数据。如…

一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版

Guitar Pro 8 .1.1for Mac 中文破解版是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xff0c;重现喜爱的歌曲或陪伴自己。可以帮助我们进行吉他的学习、绘谱与创作&#xff0c;它包含了几乎所有的吉他现有指法及音色&#xff0c;在做弹拨…

UiPath:一家由生成式AI驱动的流程自动化软件公司

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;UiPath(PATH)的股价并没有因为生成式AI的炒作而上涨&#xff0c;但很可能会成为主要受益者。 &#xff08;2&#xff09;即使在严峻的宏观环境下&#xff0c;UiPath的收入还在不…