C++中左值和右值的区别详解

作者:king9666 时间:2021-09-11 00:07:42 

左值右值定义:

左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式).

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),非常量左值和右值对其初始化。常量左值引用的右值在其生命期内只能是只读的

C++中左值和右值的区别详解

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

标签:C++,左值,右值
0
投稿

猜你喜欢

  • WinForm生成验证码图片的方法

    2022-05-11 17:49:33
  • Windows编写jar启动脚本和关闭脚本的操作方法

    2021-05-28 04:36:58
  • 深入解析java中的locale

    2023-11-09 18:14:20
  • spring获取bean的源码解析

    2023-10-11 22:15:43
  • c#入门之分支语句使用方法(三元运算符、if语句、switch语句)

    2021-12-06 00:55:20
  • Android编程之ListView和EditText发布帖子隐藏软键盘功能详解

    2023-11-06 23:09:55
  • Android CardView详解及使用方法和实例

    2023-01-11 01:04:30
  • Android登录注册功能 数据库SQLite验证

    2023-10-01 20:58:55
  • SpringBoot详解如何进行整合Druid数据源

    2022-05-10 10:46:54
  • 使用 Lambda 取代 Android 中的匿名类

    2023-11-16 14:01:04
  • java开发_图片截取工具实现原理

    2023-10-23 22:52:06
  • java的io操作(将字符串写入到txt文件中)

    2022-05-28 22:59:23
  • java判断String类型是否能转换为int的方法

    2022-08-17 23:45:52
  • c#定时器使用示例详解

    2022-01-09 03:31:05
  • java阶乘计算获得结果末尾0的个数代码实现

    2022-11-30 00:01:02
  • Spring MVC请求参数的深入解析

    2021-11-26 22:55:25
  • Java如何使用ReentrantLock实现长轮询

    2023-11-26 00:09:08
  • C#任务并行Parellel.For和Parallel.ForEach

    2022-04-19 22:07:58
  • 经典排序算法之冒泡排序(Bubble sort)代码

    2021-06-08 06:06:18
  • java实现微信公众号发送模版消息

    2022-04-23 08:09:11
  • asp之家 软件编程 m.aspxhome.com