&mut T并&mut T导致编译错误;太好了,两次可变地借款是客观上的错误。
是*mut T和*mut T未定义的行为,还是这是完全正确的事情?也就是说,可变指针别名有效吗?
是什么使事情变得更糟的是,&mut T和*mut T实际上编译和作品如预期,我可以通过引用,指针,然后再参考修改值...但我看到有人说,这是不确定的行为。是的,“有人说过”是我唯一的信息。
这是我测试的内容:
fn main() {
let mut value: u8 = 42;
let r: &mut u8 = &mut value;
let p: *mut u8 = r as *mut _;
*r += 1;
unsafe { *p += 1; }
*r -= 1;
unsafe { *p -= 1; }
println!("{}", value);
}
Run Code Online (Sandbox Code Playgroud)
当然,主要的问题是:
注意 —感谢trentcl 指出此示例在创建时实际上会导致复制p2。可以通过用u8非Copy类型替换来确认。然后,编译器抱怨此举。可悲的是,这并不能使我更接近答案,仅是提醒我,仅由于Rust的move语义,我就可以得到意想不到的行为而不会成为未定义的行为。
fn main() { …Run Code Online (Sandbox Code Playgroud)