左值 右值 二
https://www.jianshu.com/p/94b0221f64a5
https://en.cppreference.com/w/cpp/language/value_category
https://en.cppreference.com/w/cpp/language/operator_member_access
通俗定义
-
大体还可以根据是否可以放到等号左右来区分,如果可以放到等号左边,就是左值,只能放到等号右边,就是右值
-
左值肯定在内存中有一个空间保存,右值可以理解为临时的数据,并没有专门保存
实例
一
int a = 123;
这里a是一个变量,有对应内存空间,所以a是左值,并且a可以放到等号左边,123是右值,它赋值完后就没了,并没有专有内存保存,并且不可以放到等号左边,只能在右边
二
int a = 123;
int * b = &a;
这个也是可以的,因为&符号,取地址符,是传入一个左值,返回一个纯右值。
三
int a;
123 = a;
int * b = &123;
这样都是不可以的,首先123是右值,不能放到等号左侧,它没有对应空间,无法保存a的值,同样,因为&需要传递一个左值,并且123没有空间,就没办法取地址
四
函数根据其返回值不同会有不同的意义,返回为左值引用的函数可以做左值,返回为非引用的只能做右值
int test1()
{
return 123;
}
int b;
int& test2()
{
b = 123;
return b;
}
test1() = 123;
是错误的,因为是test1返回的是右值,不能赋值
test2() = 123;
是对的,因为返回的是b,是左值
五
左值可以转换为右值
int a = 123;
int b = 123;
int c = a + b;
这里a + b
变成了右值
六
可以将一个右值常量绑定到一个左值const引用
const int & a = 123;
123的生命周期延长至与a相同
同理,如下调用是合法的
int test(const int & a)
{
return 0;
}
int main()
{
test(123);
return 0;
}