左值与右值
左值和右值有如下3个规则:
- 左值和右值都是表达式。
- 左值是对象定位器,理论上左值指示指示一个对象。
- 右值是一个临时值,其他位置无法访问这个值,通常情况下在语句执行完成后右值就被丢弃。
http://c.biancheng.net/view/281.html
左值:可以进行取地址的称为左值。
右值:不能进行取地址的称为右值。右值包括:临时对象、匿名对象、临时变量、匿名变量、字面值常量(10)
左值引用
传统的左值引用:
int a = 10;
int &b = a; // 定义一个左值引用变量
b = 20; // 通过左值引用修改引用内存的值
左值引用在汇编层面其实和普通的指针是一样的;定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。
错误的左值引用:
int &val = 10;
10无法进行取地址操作,无法对一个立即数取地址,因为立即数并没有在内存中存储,而是存储在寄存器中,在这一行代码执行完毕后,就被丢弃了,可以通过下述方法(常引用)解决:
const int& val = 10;
// 等价于
const int temp = 10;
const int &val = temp;
小结:
左值引用要求右边的值必须能够取地址,如果无法取地址,可以用常引用;但使用常引用后,我们只能通过引用来读取数据,无法去修改数据,因为其被const修饰成常量引用了。
标签:10,const,右值,int,左值,C++,引用 From: https://www.cnblogs.com/MyXjil/p/17290124.html由此可知,为什么很多情况下(自定义的拷贝构造函数,运算符重载等场景下)函数的参数需要用const修饰,因为为了增强代码的健壮性。如果不用const修饰,当我们在调用函数时传入一个右值就会出问题,即普通的左值引用无法绑定到右值上,必须使用常左值引用才能绑定右值。