C++中左值和右值的区别详解
作者:king9666 发布时间:2021-09-11 00:07:42
标签:C++,左值,右值
左值右值定义:
左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式).
int a;
int b;
a = 1;
b = 2;
a = b;
b = a;
a + b = 3; // 非法表示
右值分为纯右值和将亡值:
纯右值:临时变量和不跟对象关联的字面量值
将亡值:在确保其他变量不再被使用或即将销毁时,通过盗取的方式,可以避免内存空间的释放和分配,能够延长变量值的生命期。右值通常不具有名字,也只能通过引用的方式找到它的存在。
特性
首先, 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修饰(cv-qualitification ignored)
其次,对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。
自定义类型应该设计得和内置类型尽量一样(所谓 value type,value semantic),但允许成员函数改变右值这个特性却有意无意使得自定义类型特殊化了。
对此,我们其实可以这样想:自定义类型允许有成员函数,而通过右值调用成员函数是被允许的,但成员函数有可能不是 const 类型,因此通过调用右值的成员函数,也就可能会修改了该右值
左值引用, 右值引用
引用类型本身并不拥有所绑定对象的内存,只是该对象的一个别名。
左值引用是具名变量值的别名,右值引用是不具名(匿名)变量的别名。
常量左值引用是个万能引用类型,可接受常量左值(带有const),非常量左值和右值对其初始化。常量左值引用的右值在其生命期内只能是只读的
E.g.1
int &a = 2; # 左值引用绑定到右值,编译失败
int b = 2; # 非常量左值
const int &c = b; # 常量左值引用绑定到非常量左值,编译通过
const int d = 2; # 常量左值
const int &e = c; # 常量左值引用绑定到常量左值,编译通过
const int &b =2; # 常量左值引用绑定到右值,编程通过
E.g.2
int a;
int &&r1 = c; # 编译失败
int &&r2 = std::move(a); # 编译通过
来源:https://blog.csdn.net/king9666/article/details/122701514


猜你喜欢
- 目录项目说明零,准备工作Github地址一,项目背景及系统结构二,持久层设计三,Model层四,DAO(Data Access Object
- 定义JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动
- 本文以实例形式讲述了C语言实现二叉树的非递归遍历方法。是数据结构与算法设计中常用的技巧。分享给大家供大家参考。具体方法如下:先序遍历:voi
- 最近需要用到微信的标签功能(如下图所示)。该功能可以添加已有标签,也可以自定义标签。也可以删除已编辑菜单。研究了一番。发现还是挺
- 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。重写(Overriding)是父类与子类之间多
- SpringBoot运行Test时报错运行Test时的报错信息:SpringBoot Unable to find a @SpringBoo
- 一. 安装依赖包yum install -y wgetyum install -y gcc-c++yum install -y zlib-d
- android读取assets文件下的内容,一般都是使用getAsset.open()方法,并将文件的路径作为参数传入,而当我们解析一个目录
- 本文实例为大家分享了Android实现五子棋小游戏的具体代码,供大家参考,具体内容如下配图:代码:package com.example.f
- 1.申请微信公众号我们要进行微信公众平台的开发,第一步当然是要有公众号了。什么?不知道什么是微信公众号,看来你还要先回炉炼炼了,呵呵。通俗的
- 前言经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学
- 1:在很多APP里点击返回键,都可以看到返回键由亮变为暗2:实现方法也是很简单的(1)新建一个页面<RelativeLayout &n
- 本文实例讲述了C#使用foreach遍历哈希表(hashtable)的方法。分享给大家供大家参考。具体实现方法如下:using System
- 1、return语句的作用:a、返回一个值,这个值可以是任意类型。b、使程序返回到操作系统(即终止程序)2、java中对于一个函数,不论有没
- 前言在C语言中,没有专门用来表示字符串的类型。C语言的字符串是一系列以’\0’为结尾的字符的集合。虽
- 记录自己用java swing做的第一个简易界面。LoginAction.javapackage com.QQUI0819;import j
- Spring BeanPostProcessor执行顺序首先 Spring 通过调用构造方法创建 User 对象;User 对象创建好之后,
- 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的
- 本文实例为大家分享了OpenCV Java实现人脸识别和裁剪的具体代码,供大家参考,具体内容如下安装及配置1.首先安装OpenCV,地址这里
- 本文实例为大家分享了android实现圆环倒计时控件的具体代码,供大家参考,具体内容如下1.自定义属性<?xml version=&q