我之前认为可变引用(即
如果我有这样一个函数:
并修改我的原始示例,使其看起来像这样:
我原本以为当我使用函数
如果我使用通用函数
引用被移动,因此程序的行为符合我的预期。 调用函数
&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