六一的部落格


关关难过关关过,前路漫漫亦灿灿。



虽然iostream和unique_ptr将拷贝构造函数和拷贝赋值运算符定义为删除, 但是提供了移动构造函数和移动赋值运算符

标准库容器, string和shared_ptr同时支持拷贝和移动


右值引用

rvalue reference

绑定一个临时对象:

  1. 所引用的对象将要被销毁
  2. 该对象没有其他用户

我们可以自由地接管所引用对象的资源: 将一个右值引用的资源移动到另一个对象中


显式地将左值转换为对应的右值引用类型

std::move

  1. 将给定左值转换为右值
  2. 我们可以销毁一个移后源对象, 也可以赋予它新值, 但不能使用一个移后源对象的值

调用std::move之后, 不能对移后源对象的值做任何假设


示例

程序员自行保证: 除了对rr1赋值, 和销毁rr1外, 将不再使用它

1int &&rr1 = 5;
2int &&rr2 = std::move(rr1);

对象移动


虽然iostream和unique_ptr将拷贝构造函数和拷贝赋值运算符定义为删除, 但是提供了移动构造函数和移动赋值运算符

标准库容器, string和shared_ptr同时支持拷贝和移动


右值引用

rvalue reference

绑定一个临时对象:

  1. 所引用的对象将要被销毁
  2. 该对象没有其他用户

我们可以自由地接管所引用对象的资源: 将一个右值引用的资源移动到另一个对象中


显式地将左值转换为对应的右值引用类型

std::move

  1. 将给定左值转换为右值
  2. 我们可以销毁一个移后源对象, 也可以赋予它新值, 但不能使用一个移后源对象的值

调用std::move之后, 不能对移后源对象的值做任何假设


示例

程序员自行保证: 除了对rr1赋值, 和销毁rr1外, 将不再使用它

1int &&rr1 = 5;
2int &&rr2 = std::move(rr1);