Rust 移动原始实例后,不会反映使用字段可变引用的更改

Rust 移动原始实例后,不会反映使用字段可变引用的更改,rust,reference,move,Rust,Reference,Move,我试图通过从其实例Foo借用可变引用来操作结构Foo的字段x 如果在原始实例移动后,我尝试使用实例的移动绑定foo打印字段x,它将继续打印未更改的值 简化示例如下: structfoo{ x:i32, } fn main(){ 设mut-foo=foo{x:42}; 设x=&mut-foo.x; *x=13; 设y=foo; println!(“{}”,y.x);//->42;预期结果:13 } 相反,如果我打印移动的绑定y本身,它将打印更改的值 println!(“{:?}”,y);//->

我试图通过从其实例
Foo
借用可变引用来操作结构
Foo
的字段
x

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

简化示例如下:

structfoo{
x:i32,
}
fn main(){
设mut-foo=foo{x:42};
设x=&mut-foo.x;
*x=13;
设y=foo;
println!(“{}”,y.x);//->42;预期结果:13
}
相反,如果我打印移动的绑定
y
本身,它将打印更改的值

println!(“{:?}”,y);//->Foo{x:13}
或者,如果我在移动之前打印其他内容,如
x
foo.x
,它会按预期打印内容

println!(“{}”,x);//->13
设y=foo;
普林顿!(“{}”,y.x);//->13

这是预期的行为吗?

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

一个跟踪它的问题

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

这个bug几乎不可能在真实代码中触发。您需要所有进入bug的值都是常量,其间不能有任何控制流或函数调用


版本1.45.1,并包含。后来发布的版本有更多(不相关的)修复。

这似乎是一个非常严重的错误,在我为它打开的Rust 1.45中引入。如果它有好处,这也
println!({:?}),(&y.x)打印预期结果,如果执行
println!(“{:?}”,y.x)在上一次println之后,它还打印了预期的结果:这似乎不再发生在或1.47.0上。这个错误似乎在一个月前就已经知道并修复了,但不知何故没有包含在测试版中,直到现在才被注意到。我将在一段时间内保持GitHub问题的最新答案。