我的印象是可变引用(即&mut T
)总是被移动。这是非常有意义的,因为它们允许独占可变访问。 在下面的一段代码中,我将一个可变引用赋值给另一个可变引用,并移动原文。因此,我不能用原来更多:为什么可变引用不在这里移动?
let mut value = 900;
let r_original = &mut value;
let r_new = r_original;
*r_original; // error: use of moved value *r_original
如果我有这样的功能:
fn make_move(_: &mut i32) {
}
和修改我原来的例子是这样的:
let mut value = 900;
let r_original = &mut value;
make_move(r_original);
*r_original; // no complain
我期望当我使用它调用函数make_move
时,可变参考r_original
被移动。但是,这并没有发生。通话结束后,我仍然可以使用该参考。
如果我使用一个通用的功能make_move_gen
:
fn make_move_gen<T>(_: T) {
}
,并调用它像这样:
let mut value = 900;
let r_original = &mut value;
make_move_gen(r_original);
*r_original; // error: use of moved value *r_original
基准再次移动,因此该方案表现为我所期望的。 调用函数make_move
时,为什么参考没有移动?
显式实例化('make_move :: <&mut i32>(r_original);')像原始函数(不移动)一样工作。迷人;我会假设在类型推断之前进行借用检查。 – Veedrac
从dacker的回答我假设是这样的:显式注释类型是一个可变引用触发内容的重新借用而不是移动,留下原始引用再次可用一旦新引用(这里在make_move的范围)超出范围。 –