在c++ 11之前,我们所说的引用只有左值引用,现在我们通常所说的引用也是左值引用,但是准确一点说,c++11之后,除了左值引用,还有右值引用。
在之前所谓左值就是表达式左边的值,所谓右值就是表达式右边的值,比如:
int a = 10;
//其中 a就是左值, 10就是右值
int b = a;
//其中 b是左值,a 是右值
在c++11之后,又有了明确的定义:
L-value(左值):是指可寻址的,L指的是location,Avalue (computer science)that has an address
R-value(右值):其中的R指的是Read,in computer science, a value that does not have an address in a computer language.
左值,指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以作为一个左值。
右值,指的是引用了一个存储在某个内存地址里的“数据”。
上面的两个定义可以看出,左值其实要引用一个对象,而一个对象在我们的程序中又肯定有一个名字或者可以通过一个名字访问到,所以左值又可以归纳为:左值表示程序中必须有一个特定的名字引用到这个值。而右值引用的是地址里的内容,所以相反右值又可以归纳为:右值表示程序中没有一个特定的名字引用到这个值除了用地址。
理解了上面的定义之后,再理解左值引用和右值引