背景
开始学习 C ++11 和筹备秋招面试时,对右值援用和挪动语义进行的深刻学习,凑巧在面试中又被问到,深刻记录一下。
左值 / 右值
左值:能够取地址、位于等号右边 -> 有地址的变量
右值:没法取地址、位于等号左边 -> 没有地址的字面值、长期值
两个例子:
int a = 5;
- a-> 能够通过 & 取地址,位于等号右边,是左值。
- 5 位于等号左边,5 没法通过 & 取地址,所以 5 是个右值。
struct A {A(int a = 0) {a_ = a;}
int a_;
};
A a = A();
- a ————> 能够通过 & 取地址,位于等号右边,是左值
-
A()-> 长期值,没法通过 & 取地址,位于等号左边,是右值
左值援用 / 右值援用
援用的实质是别名。
通过援用批改变量的值,传参时传援用能够防止拷贝。左值援用
右值援用
参考资料
https://zhuanlan.zhihu.com/p/…