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
相关产品推荐
相关产品推荐

