为什么如下代码可以通过编译而不会出现类似于 cannot borrow A as immutable because it is also borrowed as mutable
的编译错误?
fn main() {
static mut A: i32 = 1;
let a = unsafe { &mut A };
let b = unsafe { &A };
println!("{}, {}", a, b);
}
1
共 4 条评论, 1 页
评论区
写评论static mut是一种特别的声明, 甚至区别于普通static,基本上无法safe的引用(即使不可变), 对应的,甚至可以用来声明一些!Sync的变量;
https://doc.rust-lang.org/stable/reference/items/static-items.html#mutable-statics
看起来确实是对 static 有不同处理,但我也没在 reference 里看到有提到这个
Why does the borrowing checker not work for static item?
--
👇
Pikachu: 不单纯是unsafe的原因。把static换成let之后,即使有unsafe也会报错。
这里应该是编译器对static做了特殊处理,但是我翻了reference没找到更具体的说明。
--
👇
GUO: 因为你用了 unsafe
不单纯是unsafe的原因。把static换成let之后,即使有unsafe也会报错。
这里应该是编译器对static做了特殊处理,但是我翻了reference没找到更具体的说明。
--
👇
GUO: 因为你用了 unsafe
因为你用了 unsafe