左值
一个左值是一个标识非临时性对象的表达式,一般的法则是,如果程序中有一个变量名,那么它就是一个左值,而不管变量是否可被修改。
右值
一个右值是一个标识临时性对象的表达式,或者是一个不与任何对象相联系的值(如字面值常数)
引用
引用类型允许我们为一个已存在的值定义新的名字。在传统C++中引用一般只能是一个左值的名字,在C++11中可以有两种类型的引用:左值引用和右值引用。
左值引用
C++11中,左值引用的声明是通过在某个类型后放置一个符号&来进行的,此时的左值引用成为了它所引用的对象的同义词(别名)。
string str = "hell";
string &rstr = str; //rstr是str的另一个名字
rstr += 'o'; //str变为"hello"
bool cond = (&str == &rstr); //true,str和rstr是同一对象
string &bad1 = "hello" //非法,"hello"不是可修改的左值
string &bad2 = str + ' '; //非法, str+' '不是左值
string & sub = str.substr(0, 4); //非法,str.substr(0, 4)不是左值
右值引用
C++11中,右值引用是通过在某个类型后放置一个符号&&而被声明的。右值引用与左值引用具有相同的特征,不同于左值引用的是,右值引用也可以引用一个右值(临时性的变量)
string str = "hell";
string && bad1 = "hello"; //合法
string && bad2 = str + ' '; //合法
string && sub = str.substr(0, 4); //合法