C++ > 右值引用和左值引用的区别
右值引用和左值引用有什么区别?
右值引用,只能绑定到右值的引用,通过&&获得,即只能绑定到即将销毁的对象上,如字面量,临时计算结果,函数返回值,无名对象。
特点:
1)通过右值引用,可自由地移动(std::move)绑定的资源。
2)返回右值的,包括非引用类型的函数及算术、关系、位、后置递增/递减运算符。
3)右值引用的对象,是短暂的、即将销毁的。
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能将左值转换成右值引用类型
左值引用,是常规引用,不能绑定到要转换的表达式、字面量或返回右值的表达式。
特点:
1)返回左值的表达式包括返回左值引用的函数及赋值、下标、解引用、前置递增/递减运算符。
2)左值引用的对象是持久的,不会马上销毁。
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);

浙公网安备 33010602011771号