结论:Rust 默认采用移动(move)语义——赋值、传参、返回值都会把值的所有权转移给新绑定,原变量随即失效;只有实现了 Copy trait 的类型(如 i32boolchar、不可变引用、元素全部可 Copy 的元组)才执行隐式按位复制,原变量继续可用。

展开:移动语义配合"每个值有且只有一个所有者",让编译器能在所有者离开作用域时安全释放资源,避免浅拷贝带来的 double free。StringVec 等持有堆内存的类型刻意不实现 Copy,需要深拷贝时显式调用 clone()。约束:Copy 要求类型不持有堆资源,且 Copy: Clone(Copy 是 Clone 的子 trait);实现了 Drop 的类型不能再实现 Copy,否则按位复制会让析构逻辑执行两次。追问方向:为什么 &mut T 不是 Copy?因为可变借用必须独占,若可复制就破坏了借用规则。

let s1 = String::from("hi");
let s2 = s1;          // 移动:s1 失效
let x = 42;
let y = x;            // 复制:x 仍可用
let s3 = s2.clone();  // 显式深拷贝