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);