背景

开始学习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/...