首页 > 编程语言 >C++左值右值

C++左值右值

时间:2023-01-22 21:11:40浏览次数:34  
标签:10 右值 int 左值 C++ num 引用

lvalue:locator value 翻译为左值?可定位的值
rvalue:read value 翻译为右值?可读的值
似乎放在等号左边的叫左值,右边的叫右值?

lvaue是指存储在内存中、有明确存储地址(可寻址)的数据,可以通过变量名访问和改变其值
rvalue指的是可以提供数据值的数据,不一定可以寻址,例如存储于寄存器中的数据

int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错

摘抄
理解1
每一个变量都有两个值:

数据值,存储在某个内存地址中。有时这个值也被称为对象的右值,我们也可认为右值的意思是被读取的值read value,文字常量和变量都可被用作右值。

地址值,即存储数据值的那块内存的地址。它有时被称为变量的左值,我们也可认为左值的意思是位置值locator value,文字常量不能被用作左值

理解2
左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象
右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字

理解3
int a = 5;
5 = a; //错误,5 不能为左值,5是右值

  1. 有名称的、可以获取到存储地址的表达式即为左值;反之则是右值。

C++11中右值又由两个概念组成:将亡值Expiring value,简称 xvalue和纯右值Pure value,简称 pvalue
纯右值:非引用返回的临时变量( int func() )、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等
将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值

左右值引用
引用本身不拥有所绑定对象的内存,只是该对象的一个别名,左值引用就是有名变量的别名,右值引用是不具名变量的别名

C++98/03 标准中就有引用,使用 "&" 表示。但此种引用方式有一个缺陷,即正常情况下只能操作 C++ 中的左值,无法对右值添加引用
int num = 10;
int &b = num; //正确
int &c = 10; //错误

但允许使用常量左值引用操作右值。也就是说,常量左值引用既可以操作左值,也可以操作右值,例如:
int num = 10;
const int &b = num;
const int &c = 10;//右值

右值引用也必须立即进行初始化操作,比如:
int num = 10;
//int && a = num; //右值引用不能初始化为左值
int && a = 10;
int&& val1 = x; //但也有说可以用右值初始化的,既可以绑定左值也可以绑定右值,有空我会试试

和常量左值引用不同的是,右值引用还可以对右值进行修改。例如:
int && a = 10;
a = 100;

std::move()可以把左值引用, 转换为右值引用

标签:10,右值,int,左值,C++,num,引用
From: https://www.cnblogs.com/lxzbky/p/17064672.html

相关文章