【发布时间】:2022-11-08 20:00:27
【问题描述】:
我的错误代码 sn-p 和编译器错误信息:
// code snippet 1:
0 fn main() {
1 let mut x: Box<i32> = Box::new(4);
2 let r: &Box<i32> = &x;
3 *x = 8;
4 println!("{}", r);
5 }
// compiler error info:
error[E0506]: cannot assign to `*x` because it is borrowed
--> src/main.rs:3:4
|
2 | let r = &x;
| -- borrow of `*x` occurs here
3 | *x = 8;
| ^^^^^^ assignment to borrowed `*x` occurs here
4 | println!("{}", r);
| - borrow later used here
For more information about this error, try `rustc --explain E0506`.
以下代码无法编译,这对我来说很有意义,因为我们不能使引用 r 无效。
// code snippet 2:
0 fn main() {
1 let mut x: i32 = 0;
2 let r: &i32 = &x;
3 x = 1;
4 println!("{}", r);
5 }
但是code snippet1 的compiler error info 对我来说没有多大意义。
x 是堆栈上的指针,指向堆内存段,其内容为 4 ,引用 r 仅借用 x (指针不是堆内存段),而在第 3 行 *x = 8; ,什么我们在这里所做的就是改变堆上的内存(而不是栈上的指针)。更改发生在堆上,而引用仅与堆栈相关,它们不相互关联。
这个问题有点挑衅,但我不是为了争论而争论。
如果您发现我的问题不正常,请随时指出:)
【问题讨论】:
标签: pointers rust lifetime borrow-checker