左值、右值 、左值引用、右值引用的总结

文章目录

  • 什么是左值
  • 什么是右值
    • 纯右值:
    • 将亡值:
  • 左值引用
  • 右值引用

在C语言中我们常常会提起左值(lvalue) 和 右值(rvalue) 这样的称呼。编译器在编译程序报错时, 有时也会报出错误信息中会包含左值、右值的说法。但是左值和右值并没有一个严谨的定义。大多数时候左右值的定义与其判别方法是一体的。
一个典型的的判别方法就是,在赋值表达式中。出现在等号左边的就是 左值,而在等号右边的,则称为 右值
例如:
a = b + c;
在这个赋值表达式中,a就是一个左值,而b+c则是一个右值。这种识别左值、右值的方法在C++中依然有效。
不过C++中还有一个被广泛认同的说法,那就是 可以取地址的、有名字的就是左值,反之 , 不能取地址的、没有名字的就是右值
在这个赋值表达式中,&a是运行的操作。但是&(b+c) 这样的操作则不会通过编译。因此 a 是一个左值, (b+c) 是一个右值。

什么是左值

可以和按照C++上的说法:可以取地址的、有名字的就是左值。

什么是右值

不能取地址的、没有名字的就是右值。具体在C++11中,右值是由两个概念构成的。
一个是将亡值。一个是纯右值。

纯右值:

纯右值(prvalue, Pure Rvalue)就是C++98标准中的右值概念,比如函数返回的临时变量值。还有一些运算表达式,比如 1 + 3 产生的临时变量值。
不跟对象关联的字面量值,比如:2、‘c’ 、true。lambda表达式 。都是纯右值。

将亡值:

将亡值 (xvalue, eXpiring) 是C++11中新增的跟右值引用相关的表达式。这样的表达式通常是将要被移动的对象(移为他用)。
比如:返回右值引用 T&& 的函数返回值;std::move的返回值; 转换为T&&的类型转换函数的返回值。

:在C++11的程序中,所有的值必属于左值、将亡值、纯右值三者之一。

左值引用

左值引用就是C++98中的引用 T&。在没出来C+11的右值引用之前。说的引用都是指的左值引用。
例如:
int a = 10;
int & b = a;
const int & c = a;
b和c都是 左值引用。b是非常量左值引用。c是常量左值引用。
左值引用顾名思义就是对一个左值进行引用的类型。也就是等号右侧的是一个左值(可取地址的)。
而常量左值引用类型 比较特殊,也可以对右值进行引用。如 const int &d = 2; 但是 int &d = 2;是编译不过的。
因此常量左值引用类型也称为万能的引用类型。通过常量左值引用不可以修改所引用的内容。而 非常量左值引用可以修改引用的内容。

右值引用

右值引用是C++11中新增的一种引用类型,顾名思义就是对一个右值进行引用的类型。事实上,由于右值不具有名字。我们也只能通过引用的方式找到的它的存在。
例如:T && a = ReturnRvalue();
这个表达式中,假设ReturnRvalue函数返回一个右值,我们就声明了一个名为a的右值引用,其值等于ReturnRvalue函数返回的临时变量的值。
注意: T&& 就是 右值引用的类型。与左值引用比较多了个 &符号。和二级指针的使用方式 不一样。C++上不存在二级引用。
注意:引用 也是一个变量,不过是一种特殊的变量,拥有自己的类型。
相同点
左值引用和右值引用都是属于引用类型。
无论声明的一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定的对象的内
存,只是该对象的一个别名,几乎不占用什么内存。
不同点
左值引用是具名变量值的别名,而右值引用则是不具名(匿名)变量的别名。
右值引用是不能够绑定到任何的左值的。比如:
int c;
int && d = c;//编译不过
相对的左值引用也是不可以绑定到右值(由右值进行初始化)的。
比如:
T & e = ReturnRvalue();//编译不过。
但是存在例外:const T & e = ReturnRvalue();//编译通过。上面我们说常量左值引用是万能引用类型,它可以接收非常量左值(如:int
c),常量左值(如:const int c)、右值对其进行初始化。
右值引用类型的使用场景:用于移动构造函数的形参类型 和 移动语义紧密相关联。

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

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

相关文章

Numpy数组的重塑,转置与切片 (第6讲)

Numpy数组的重塑,转置与切片 (第6讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

String 和 StringBuffer和 StringBuilder 场景应用

目录 1.三者区分2.String 不可变性的示例代码:3.String 频繁创建对象4.StringBuffer 是可变的,可以进行增删改操作而不产生新的对象。5.StringBuffer 是线程安全的,适合在多线程环境下使用,但同步会带来一定的性能损耗。 代码举例…

聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化

聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化 目录 聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于谱聚类(Spectral Cluster)的聚类算法可视化(完…

融云 Global IM UIKit

GlobalIM UIKit 基于多年领先的行业经验,我们为开发者提供功能完备的单群聊 通信能力。“分钟级”接入,即可得到符合海外用户使用习惯的多端同步产品。 核心功能包括:快速接入、功能齐全、全球化交互体验、内容审核、灵活可配置、高度自定义、…

c++详解栈

一.什么是栈 堆栈又名栈(stack),它是一种运算受限的数据结构(线性表),只不过他和数组不同,数组我们可以想象成一个装巧克力的盒子,你想拿一块巧克力,不需要改变其他巧克…

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(二)——数据清洗、转换

2 数据清洗、转换 此实验使用S3作为数据源 ETL: E extract 输入 T transform 转换 L load 输出 大纲 2 数据清洗、转换2.1 架构图2.2 数据清洗2.3 编辑脚本2.3.1 连接数据源(s3)2.3.2. 数据结构转换2.3.2 数据结构拆分…

FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码

学习FFmpeg的时候,经常要到GitHub下载各种开源代码,比如FFmpeg的源码页面位于https://github.com/FFmpeg/FFmpeg。然而国内访问GitHub很不稳定,经常打不开该网站,比如在命令行执行下面的ping命令。 ping github.com 上面的ping结…

初识Linux:权限(1)

目录 提示:以下指令均在Xshell 7 中进行 Linux 的权限 内核: 查看操作系统版本 查看cpu信息 查看内存信息 外部程序: 用户: 普通用户变为超级用户: su 和 su-的区别: root用户变成普通用户&#…

KALI LINUX信息收集

预计更新 第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

什么是SSL证书?

当我们网上购物或银行业务时,为了安全起见,我们希望看到网站的地址栏上有“HTTPS”和安全锁图标。但是这个“HTTPS”和锁定图标实际上意味着什么?要回答这些问题,我们需要了解 HTTPS、SSL 协议和 SSL 证书。 关于HTTPS、SSL和SSL…

风控反欺诈安全学习路标

1. 金融和支付领域知识 - 了解金融和支付领域的基本概念、业务流程和风险特点。 - 学习金融机构的监管要求和合规措施,如KYC(了解你的客户)和AML(反洗钱)。 2. 数据分析和挖掘技术 - 学习数据分析和数据挖掘的基本原理…

fastadmin获取关联表数据select渲染

php public function piliangadd(){if (false === $this->request->isPost()) {$fenlei_list = Db::name(fenlei)->order(weigh desc)->select();$this</

每天五分钟计算机视觉:稠密连接网络(DenseNet)

本文重点 在前面的课程中我们学习了残差网络ResNet,而DenseNet可以看成是ResNet的后续,我们看一下图就可以看出二者的主要区别了。 特点 DenseNet是一种卷积神经网络,它的特点是每一层都直接连接到所有后续层。这意味着,每一层都接收来自前一层的输出,并将其作为输入传递…

Flyway——Oracle创建前缀索引

文章目录 前言创建一般索引的语法前缀索引 前言 索引有助于提升数据库表的查询速率&#xff0c;极大的缩减查询的时间。但索引的创建需要考虑的因素很多&#xff0c;并非索引越多越好&#xff01; 创建一般索引的语法 oracle创建一般的常见索引&#xff0c;语法如下所示&…

n个人排成一圈,数数123离队

#include<stdio.h> int main() { int i, n100,k0,j0,a[1000]{0};//k&#xff1a;数数123的变量&#xff0c;j记录离开队列人数的变量scanf("%d",&n);for(int ii0; ii<n; ii){ for( i0; i<n; i){// printf("wei%d ",i);if((a[i]0)&&…

掌握Line多开技术,打造私人专属空间

掌握Line多开技术&#xff0c;打造私人专属空间 在现代社交网络的时代&#xff0c;人们经常需要同时处理多个社交账号&#xff0c;例如工作、家庭、朋友等不同领域的社交关系。而对于Line这样的主流社交应用来说&#xff0c;多开技术可以让用户更便捷地管理多个账号&#xff0…

数据结构线性表-栈和队列的实现

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 …

Vue学习计划-Vue2--Vue核心(三)methods和computed

Vue 1. 事件 v-on 基础 使用 v-on:xxx或者xxx绑定事件&#xff0c;其中xxx是事件名 事件的回调需要配置在methods对象中&#xff0c;最终会在vm上 methods中配置函数&#xff0c;不要用箭头函数&#xff0c;否则this就不是vm了 methods中配置函数&#xff0c;都是被Vue管…

Seata使用

本文以seata-server-1.5.2&#xff0c;以配置中心、注册中心使用Nacos&#xff0c;store.modedb&#xff08;mysql&#xff09;为例进行操作。 一、Seata Server端 1、下载seata server 链接: http://seata.io/zh-cn/blog/download.html下载压缩包&#xff0c;解压至非中文目录…

Java技术栈 —— 微服务框架Spring Cloud —— Ruoyi-Cloud 学习(一)

Ruoyi-cloud 项目学习 一、项目环境搭建与启动1.1 nacos安装部署1.1.1 nacos安装、启动1.1.2 nacos部署 1.2 seata安装部署1.3 后端部署与运行1.3.1 ruoyi-modules-file模块运行报错 1.4 nginx安装、部署、配置与启动1.5 redis安装与部署1.6 前段框架知识1.7 项目启动1.8 参考 …