Rust疑问:添加类型信息为何能阻止所有权转移?
代码示例与问题背景
可正常运行的代码:
fn main() { let a = &mut 1; let b: &mut i32 = a; // let b = a; a; }
替换为注释代码后触发的错误:
error[E0382]: use of moved value:
a
--> src/junk.rs:5:5
|
2 | let a = &mut 1;
| - move occurs becauseahas type&mut i32, which does not implement theCopytrait
3 | // let b: &mut i32 = a;
4 | let b = a;
| - value moved here
5 | a;
| ^ value used here after move
问题解答
1. 两种写法的语义差异
- 显式指定类型
let b: &mut i32 = a;:触发可变引用的重借用(reborrow)。Rust会基于a生成一个新的可变引用赋值给b,a的所有权并未转移,只是暂时处于被借用状态。当b的生命周期结束后,a可正常继续使用,这也是原代码能运行的核心原因。 - 隐式推导类型
let b = a;:直接执行所有权移动。由于&mut i32类型未实现Copytrait,赋值操作会把a的所有权转移给b,原变量a立刻失效,后续再使用a就会触发“使用已移动值”的错误。
2. 两种写法中b的类型是否存在区别
没有区别。两种写法里b的类型均为&mut i32:第一种是显式声明类型,第二种是Rust编译器自动推导得出的类型,完全一致。
内容的提问来源于stack exchange,提问作者Jack Reilly
相关产品推荐
相关产品推荐

