Rust可变引用传入函数的机制解析:与C++指针的对比困惑
Rust可变引用传递的核心逻辑解析
首先明确C的情况:你说得没错,C中把指针作为参数传值时,确实会拷贝出一个独立的指针副本(也就是函数里的s_ref),这个副本和原指针s指向同一个对象,两者在各自作用域内同时有效,函数结束后副本自动销毁,原指针不受影响。
但Rust的可变引用和C++指针的传参逻辑完全不同,核心原因是:Rust的可变引用(&mut T)不实现Copy trait,它的传递遵循移动语义,而不是拷贝语义。
回到你的代码:
fn func(s_ref: &mut str) {} fn main() { let mut word = "hello".to_string(); let s: &mut str = &mut word; func(s); }
当你调用func(s)时,并不是把s拷贝一份给s_ref,而是将s的引用使用权完全转移到函数参数s_ref中。此时,main作用域里的s立刻失效——编译器会禁止你在func调用之后再使用s,否则会触发编译错误。
比如尝试在func调用后使用s:
fn func(s_ref: &mut str) {} fn main() { let mut word = "hello".to_string(); let s: &mut str = &mut word; func(s); println!("{}", s); // 编译报错:value borrowed here after move }
这个报错直接证明了s已经被移动,而非拷贝。
这正是Rust保证内存安全的关键:通过移动语义,确保同一时间只有一个可变引用能访问目标对象word,完全符合"同一时间只能有一个可变引用"的借用规则。
内容的提问来源于stack exchange,提问作者Bird
相关产品推荐
相关产品推荐

