右值引用
所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&,
右值引用只能绑定到即将销毁的对象。右值引用也是引用,因此右值引用也只不过是对象的别名而已。
右值引用可以绑定到要求转换的表达式、字面常量或者返回右值的表达式,但是右值不能绑定到一个左值上。
int i = 42;
int &r = i; // 正确,r引用i
int&& rr = i; // 错误,不能将右值引用绑定到左值
int &r2 = i * 42; // 错误,i*42是一个右值
const int& r3 = i * 42;
int&& rr2 = i * 42;
返回左值的函数、连同赋值、下标、解引用和前置递增或递减运算符都是返回左值的例子。
返回非引用类型的函数、连同算数、关系、位以及后置递增或递减运算符,都是生成右值的例子。
我们可以将一个const的左值引用或一个右值引用绑定到生成右值的例子上。
我们不能把右值直接绑定到一个变量上,即使这个变量时右值引用类型也不行。
int&& rr1 = 42;
int&& rr2 = rr1; // 错误,表达式rr1是左值
标准库move函数:
我们可以通过标准库函数move来获得绑定到左值上的右值引用。
int&& rr3 = std::move(rr1);
move旨在告诉编译器,我们希望把一个左值像右值一样使用它。使用move函数就意味着:除了对rr1赋值或销毁之外,我们不能再使用它。 使用move之后,我们就不能对源对象的值做任何假设。