看什么都没有比看官方文档更棒
Rvalue Reference Declarator: &&
左值、右值
C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:
可以取地址的,有名字的,非临时的就是左值;
不能取地址的,没有名字的,临时的就是右值;
左值通常是:变量,常量等等,能出现在赋值符号左侧(是指存在于单个表达式之外的对象)
右值通常是:表达式,数值等等,不能出现在赋值符号左侧(是一个暂时存在的值存在于单个表达式之内的对象)
左值引用
在汇编层面其实和普通的指针是一样的。
标准没有说引用具体要怎么实现,很多编译器的做法是用指针实现引用,所以引用在很多编译器上还是要占用内存的。
int a = 10;
int &b = a;
左值引用要求右边的值必须能够取地址,如果无法取地址,可以用常引用;
int &var = 10; //这样不可以,10不能取地址
const int &var = 10; //改用常引用即可,但这样只能读,无法通过引用修改数据了
右值引用
格式
类型 && 引用名 = 右值表达式;
右值引用是C++ 11新增的特性,所以C++ 98的引用为左值引用。右值引用用来绑定到右值,绑定到右值以后本来会被销毁的右值的生存期会延长至与绑定到它的右值引用的生存期。
int &&var = 10;
在汇编层面右值引用做的事情和常引用是相同的,即产生临时量来存储常量。但是,唯一 一点的区别是,右值引用可以进行读写操作,而常引用只能进行读操作。
总结
右值引用将左值与右值区分开来。它们可以帮助您通过消除不必要的内存分配和复制操作来提高应用程序的性能。它们还使您能够编写接受任意参数的函数的一个版本,并将其转发给另一个函数,就好像直接调用了另一个函数一样