首页 > 解决方案 > 移动原始实例后不反映使用字段的可变引用的更改

问题描述

我试图通过从它的实例中借用一个可变引用来操纵x结构的字段。Foofoo

如果我在原始实例移动后尝试使用实例的移动绑定打印该字段,x它会继续打印未更改的值。yfoo

下面的简化示例:

struct Foo {
    x: i32,
}

fn main() {
    let mut foo = Foo { x: 42 };
    let x = &mut foo.x;
    *x = 13;
    let y = foo;
    println!("{}", y.x); // -> 42; expected result: 13
}

相反,如果我打印移动的绑定y本身,它会打印更改的值。

println!("{:?}", y); // -> Foo { x: 13 }

或者,如果我在移动之前xfoo.x 之前打印其他内容,它会按预期打印内容。

println!("{}", x); // -> 13
let y = foo;
println!("{}", y.x); // -> 13

这是预期的行为吗?

标签: rustreferencemove

解决方案


这是编译器中的一个已知错误,仅影响 rustc 1.45。rustc 1.44 不受影响,该问题已在 Beta 版上得到修复,这意味着它将在 rustc 1.46 上得到修复。

已打开一个问题来跟踪它。

虽然这个问题看起来很关键,但根据oli-obk(rustc 的主要贡献者之一),它不太可能在实际代码中找到,尤其是在const表达式中:

该错误几乎不可能在现实世界的代码中触发。您需要进入错误的所有值都是常量值,并且两者之间不能有任何控制流或函数调用。

版本 1.45.1已发布,其中包含来自 beta 的修复的反向移植等。后来的1.45.2版本发布了更多(不相关的)修复。


推荐阅读