C++中所有的表达式和变量要么是左值,要么是右值; 左值是非临时对象,可以在多条语句引用使用的对象是左值;右值是临时的对象,只在当前语句有效。
int i = 0; 其中i是左值,0是右值
右值可以出现在复制的左边
(( i > 0)? i : j) = 1; i, j都是左值, 0,1是右值
右值是可以被修改的,如:
new T().set().get();
new T()是右值,通过set()方法修改了对象,也就是右值
声明: 左值的引用声明 &, 右值的引用声明 &&
int &a (左值引用), int && a(右值引用)
注意:但是如果临时对象通过一个接受右值的函数传递给另一个函数时,就会变成左值,因为这个临时对象在传递过程中,变成了命名对象
void process_val(int& val){
ALOGE("process val & %d", val);
}
void process_val(int&& val){
ALOGE("process val && %d", val);
}
void forward(int&& val){
process_val(val);
}
forward(1);
输出:process val & 1
作用:右值引用是用来支持转移语义的。转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。