什么是左值 右值?
简单来说左值就是可以取地址,在=左边的,而右值就是不可以取地址,在=右边的。
int t=10;
- t可以通过&取地址在=左边 所以t是左值
- 10不可以取地址 在=右边10是右值。
class A{
A(int a){
a=10;
}
int a;
}
A a= A();
a可以通过&取地址,在等号左边可以a是左值。
A()不可以通过&取地址,在等号右边所以A()是右值。
什么是左值引用?什么是右值引用?
引用就是别名,同一变量的不同名字。通过引用传递参数可以避免拷贝,加快过程间执行速度。
左值引用
左值引用能指向左值不能指向右值。
int a=1;
int &b=a;// 左值引用指向左值,可以通过编译
int &b=1;// 左值引用指向右值,不可以通过编译
右值没有地址,没法被修改,所以左值引用无法指向右值。
注意: const 左值引用可以指向右值:
const int &x=5;//编译可以通过
加上const之后 不可以通过x修改指向的值,所以可以指向右值。这也是为什么使用const &作为函数参数的原因之一。如std::vector的push_back:
void push_back(const T &val);//如果没有const push_back(1)这样就不能通过编译了。
右值引用
右值引用标志是&& ,右值引用可以指向右值不能指向左值。
int &&test=1;//ok
int a=1;
int &&test=a;//编译错误,指向了右值
test=3;//可以修改右值
汇编层面的左值引用与右值引用
int a(){
int a=2;
int &&b=1;
}
右值引用 x86汇编
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 2 // 1