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

Rust中传递可变引用给不可变引用参数的两种调用是否等价?

Rust可变引用传递给不可变引用参数的调用问题

给定代码

目标函数

fn take_by_ref(i: &i32) {
    println!("{}", i);
}

测试代码框架

#[test]
fn test_mut() {
    let mut x = 9;
    let m = &mut x;
    // 两种调用方式
    take_by_ref(m); 
    take_by_ref(&*m); 
}

问题解答

两种调用完全等价

Rust本身允许可变引用自动转成不可变引用,第一种写法take_by_ref(m)里,编译器会自动帮你完成&*m的操作——也就是先解引用可变引用m拿到底层的i32,再对它取不可变引用,最终得到&i32类型的参数传给函数。所以两种写法本质上是一回事。

二者没有任何差异

不管是隐式转换的简写,还是手动写出&*m的显式写法,编译后生成的机器码完全一样,只是代码书写形式不同。显式写法只是把编译器幕后做的操作直白地写出来了而已。

不会违反借用规则

完全符合Rust的借用规则。当你把可变引用m传给需要不可变引用的函数时,Rust会临时冻结这个可变引用:在take_by_ref执行期间,你没法用m去修改x的值,此时相当于只有不可变引用在生效;等函数执行完,m的可变权限会自动恢复。这完全满足“同一时间要么有一个可变引用,要么有多个不可变引用”的规则,不存在冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:20:50