You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust编译错误:无法从共享引用后移出值的原因解析

为什么这段Rust代码无法编译?

先看代码:

fn main() {
    let x = "".to_string();
    let y = &x;
    let z = *y;
}

编译器给出的错误:

cannot move out of *y which is behind a shared reference
move occurs because *y has type String, which does not implement the Copy trait

问题核心解释

Rust的共享引用(&T)有个硬性规则:绝对不能通过共享引用转移数据的所有权。共享引用的设计初衷是让多个地方能同时安全访问数据,要是允许通过它把所有权移走,那其他引用(比如这里的y)就会变成指向无效内存的悬空指针,直接违反Rust的内存安全原则。

你原本想让z拿走String的所有权,让x和y失效,但y是x的共享引用,Rust不会允许这种操作——因为一旦*y被移动,x作为原所有者会立刻失效,但y这个引用还存在,后续任何对y的访问都会触发内存安全问题。

另外,String没有实现Copy trait,所以它不能被自动复制,只能移动。但共享引用不允许触发移动操作,因为这会破坏引用的安全性。

可行的解决办法

如果想让z获得String的所有权,有几种方式:

  • 直接从原所有者x移动:let z = x;,这样x会立刻失效,y也会因为x被移动而无法使用,完全符合你最初的预期。
  • 要是需要保留x,可以克隆String:let z = y.clone();,这样z会得到一个独立的String副本,x和y依然可以正常使用。
  • 若场景允许,也可以先将共享引用转为可变引用再操作,但这种方式没必要,直接从x移动是最简洁的选择。

内容的提问来源于stack exchange,提问作者TSK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:30:46