【发布时间】:2015-11-16 05:29:42
【问题描述】:
我的印象是可变引用(即&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);) 像原始函数一样工作(没有移动)。迷人;我假设借用检查发生在类型推断之前。 -
从 dacker 的回答中,我假设是这种情况:明确地将类型注释为可变引用会触发内容的重新借用而不是移动,一旦新参考(在 make_move 的范围内)超出范围。
标签: rust move-semantics