c++之左值和右值
1,左值和右值
定义:左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),换句话说,就是表示内存中可以寻址,可以给它赋值(const类型的变量例外);右值指的则是只能出现在等号右边的变量(或表达式),表示可以知道它的值(例如常数)。变量地址可读可写的是左值,只可读的是右值。
注意:在 c 语言中,通常来说有名字的变量就是左值,而由运算操作(加减乘除,函数调用返回值等)所产生的中间结果(没有名字)就是右值。在 c++ 中,每一个表达式都会产生一个左值,或者右值,相应的,该表达式也就被称作“左值表达式”, “右值表达式”。对于基本数据类型来说(primitive types),左值右值的概念和 c 没有太多不同,不同的地方在于自定义的类型,而且这种不同比较容易让人混淆:
- 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修饰(cv-qualitification ignored)
- 对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。(c++特有的)
3)右值不能当成左值使用(但左值可以当成右值使用)。另外值得注意的是,对于前面提到的右值的两个特性:
(1) 右值允许调用成员函数。
(2) 右值只能被 const reference 指向。
(3) 右值不能当成左值使用,但左值可以当成右值使用
总结:
左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象
右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。
纯右值:***非引用返回的临时变量( int func(void) )***、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等。
将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值。
int i = 9; //有一个内存 取个名字叫做i, 存了9
int& r1 = i; //左值引用:r1是i的别名
int&& r = std::move(i); //右值引用: 直接使用9,std::move() 函数,把左值转成右值
const cs& ref = get_cs(); //右值只能被 const 类型的 reference 所指向
还没有评论,来说两句吧...