目录
1--左值和右值的定义
2--简单理解左值和右值的代码
3--非const引用只能接受左值
1--左值和右值的定义
左值:L-Value,L理解为 Location,表示可寻;
右值:R-Value,R理解为 Read,表示可读;
左值和右值是相对于赋值表达式(=)而言的,左值可以出现在等号表达式的左边和右边,而右值只能出现在等号表达式的右边;
左值可以理解为一个内存地址值,通过这个内存地址,用户可以进行读和写的操作;右值可以理解为一个真实数据值,只能进行读的操作;简单理解左值为地址值,右值为数据值,即右值指的是引用了一个存储在某个内存地址的数据;
一个简单区分左值和右值的方法是,如果可以利用 & 符号对表达式取地址,则为左值,反之为右值;
2--简单理解左值和右值的代码
int a, b;
b = 0;
a = b;
赋值表达式 b = 0 可以理解为:取 b 的左值,即 b 对应的内存地址值;取 0 的右值,即数值0;
赋值表达式 a = b 可以理解为:取 a 的左值,取 b 的右值;
3--非const引用只能接受左值
# include <iostream>
int func(){
int i = 1;
std::cout << "func()" << std::endl;
return i;
}
int main(){
int i = 1;
const int& i_cref1 = i; // 正确
const int& i_cref2 = func(); // 正确
int& i_ref1 = i; // 正确,这里 i 是一个左值
// 非const引用只能接受左值,而func()返回的是一个右值
int& i_ref2 = func(); // 错误
}
上面的代码中,int& i_ref2 = func(); 是错误的,因为 int& 是一个非const的引用,即非常量引用,只能接收左值;而函数 func() 返回的是一个右值;