C++学习笔记(34):移动语义,右值引用

18 阅读1分钟

千重水,万重山,我们需要克服的下一关是C++中所规定的表达式的值类别的概念

value category (表达式的) 值类别

lvalue 纯左值

xvalue 既左,又右

prvalue 纯右值

image.png

image.png

  1. 右值引用( && )
  • 作用:专门绑定临时对象(用完就扔、马上销毁的东西)。
  • 本质:标记“这东西马上死了,你可以随便抢它资源”。
  1. 移动语义(Move Semantics)
  • 核心一句话: 不拷贝数据,直接把临时对象的“内存/资源”偷过来给自己用。
  • 对比:
  • 拷贝:重新造一份 → 慢、费内存。
  • 移动:直接抢过来 → 快、零拷贝。
  1. 最通俗比喻

你有一杯刚做好、马上要倒掉的奶茶(临时右值):

  • 拷贝:重新买一杯一模一样的。
  • 移动:直接把那杯快倒掉的拿过来喝,不浪费,还快。
  1. 关键规则(极简)
1.  T&&  = 右值引用,只绑临时对象。
2.  std::move(x)  = 把 x 标记成“可以被移动”,不真移动。
3. 移动构造 / 移动赋值 = 偷资源,不是复制。
4. 移动后原对象合法但不确定状态,别再用。

5. 一句话总结

右值引用是钥匙,移动语义是偷家; 临时对象别拷贝,直接偷资源最快。

std ::move是给左值打上一层语义“标签”,表明这个资源是“将亡的”,有这个标签,就会触发移动构造函数,而不是拷贝构造函数。std::move对资源本身没有做任何修改。“偷资源”这个操作是在移动构造函数中实现的,本质上就是改变了移动对象和被移动对象的指针指向,没有重新分配内存。