C++ 对象移动

右值和右值引用

  • 左值持久,右值短暂
  • 凡是有名字的都是左值,变量都是左值
    • 类型为右值引用的变量本身是个左值(下面有例子)
  • 返回值的函数返回的都是右值
  • 右值不能被绑定到左值引用,左值也不能被绑定到右值引用

std::move

  • 为了避免命名冲突,前面的std一般不省略
  • 本身并不移动对象,只是将对象的类型转换为右值
  • 调用此函数即保证后面不会再使用传入的对象

参数

stack& operator=(const stack& that);
stack& operator=(stack&& that);
  • C++的STL库中重载了两种构造函数
    • 第一种一般用来传递不想被改变的传递代价较大的参数(一般为string和自定义类型)
      • 常规类型直接值传递就好
    • 第二种称为移动构造函数,使得对象被移动而不是拷贝
      • 注意当that传递给别的变量或者作为实参时还是要显示调用std,原因见第一条,that是左值
      • 如果没有定义这个移动构造函数,即使传入的实参使用move成了右值,依然需要拷贝
    • 实际上如果传入的参数可能是右值时其实不用像上面那样重载两个函数,这样参数多了需要重载很多函数,直接传值就好了,原因如下图

C++ 对象移动

返回值

  • 对于一个局部变量,很多人喜欢在作为返回值时调用std::move,其实这是不必要的,直接返回值就好,理由如下图:
    C++ 对象移动