千重水,万重山,我们需要克服的下一关是C++中所规定的表达式的值类别的概念
value category (表达式的) 值类别
lvalue 纯左值
xvalue 既左,又右
prvalue 纯右值
- 右值引用( && )
- 作用:专门绑定临时对象(用完就扔、马上销毁的东西)。
- 本质:标记“这东西马上死了,你可以随便抢它资源”。
- 移动语义(Move Semantics)
- 核心一句话: 不拷贝数据,直接把临时对象的“内存/资源”偷过来给自己用。
- 对比:
- 拷贝:重新造一份 → 慢、费内存。
- 移动:直接抢过来 → 快、零拷贝。
- 最通俗比喻
你有一杯刚做好、马上要倒掉的奶茶(临时右值):
- 拷贝:重新买一杯一模一样的。
- 移动:直接把那杯快倒掉的拿过来喝,不浪费,还快。
- 关键规则(极简)
1. T&& = 右值引用,只绑临时对象。
2. std::move(x) = 把 x 标记成“可以被移动”,不真移动。
3. 移动构造 / 移动赋值 = 偷资源,不是复制。
4. 移动后原对象合法但不确定状态,别再用。
5. 一句话总结
右值引用是钥匙,移动语义是偷家; 临时对象别拷贝,直接偷资源最快。
std ::move是给左值打上一层语义“标签”,表明这个资源是“将亡的”,有这个标签,就会触发移动构造函数,而不是拷贝构造函数。std::move对资源本身没有做任何修改。“偷资源”这个操作是在移动构造函数中实现的,本质上就是改变了移动对象和被移动对象的指针指向,没有重新分配内存。