У меня создалось впечатление, что изменяемые ссылки (т. Е. &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
Я ожидал бы, что изменяемая ссылка r_original
перемещается, когда я вызываю ее с помощью функции make_move
. Однако этого не происходит. Я все еще могу использовать ссылку после вызова.
Если я использую функцию универсального 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) выходит за рамки. –