结论:移动值需要按值交出所有权,而 Deref::deref(&self) -> &Target 只返回借用,类型系统上就无法表达"通过引用把里面的值 move 走"。Box 是特例——编译器为它内置了开箱移动(*b 在值上下文合法);对 Rc/Arc 这类共享指针,即使允许移动也会违反"多个所有者"语义,所以没有 DerefMove

展开:三层原因:1)签名层面,move 需要 self -> Target 之类的按值方法,但移动整个智能指针(self by value)正是要避免的事,递归无解。2)语义层面,Rc<T> 可能有多个所有者,把 T 移走后其余所有者指向的就是已析构内存;标准库提供 Rc::try_unwrap/Arc::try_unwrap,仅当引用计数为 1 时才安全交出值。3)稳定性层面,Box 的特殊解引用移动是编译器内建行为(deref_pure),普通类型无法复刻。易错点:想从 &mut T 里换出值不能用 move,正确工具是 mem::replace / mem::take(要求 Default)。

use std::rc::Rc;
let rc = Rc::new(String::from("hi"));
// let s = *rc;              // 编译错误:不能 move
let s = Rc::try_unwrap(rc);   // Ok("hi"):计数为 1,安全
let mut v = vec![1, 2];
let old = std::mem::take(&mut v); // 换出,v 变空 Vec

追问方向:Box 特权的移除计划(DerefPure/DerefMove 的 RFC 讨论)、mem::swap 的实现原理。