C++ > 右值引用和左值引用的区别

右值引用和左值引用有什么区别?
右值引用,是只能绑定到右值的引用,通过&&获得,只能绑定到即将销毁的对象上(如字面量,临时计算结果,函数返回值,无名对象)。通过右值引用可以自由地移动绑定的资源。
返回右值的包括非引用类型的函数及算术、关系、位、后置递增/递减运算符。

右值引用的对象是短暂的,即将销毁的。

int a = 2;
int &&r1 = 10; // 正确,右值引用可以绑定字面量
int &&r2 = a;  // 错误,带类型的变量不是右值
int &&r3 = std::move(a); // 正确,std::move能将左值转换成右值引用类型
int &&r4 = a * 10; // 正确,临时计算结果是右值
int &&r5 = *(new int(2)); // 错误, 不能绑定int型左值
int &&r6 = std::move(*new int(10)); // 正确,std::move能将左值转换成右值引用类型

左值引用,是常规引用,不能绑定到要转换的表达式、字面量或返回右值的表达式。返回左值的表达式包括返回左值引用的函数及赋值、下标、解引用、前置递增/递减运算符。
左值引用的对象是持久的,不会马上销毁。

int &rr1 = a;
int &rr2 = 1; // 错误
int &rr3 = std::max(10,20); // 错误
vector<int> vec = {1,2,3,4};
int &rr4 = vec[2];
int &rr5 = a * 10; // 错误
int &rr6 = *new int(10); 
posted @ 2021-03-15 19:17  明明1109  阅读(514)  评论(0编辑  收藏  举报