< 返回版块

Hello World 发表于 2023-08-19 10:15

为什么如下代码可以通过编译而不会出现类似于 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);
}

评论区

写评论
aj3n 2023-08-21 14:14

static mut是一种特别的声明, 甚至区别于普通static,基本上无法safe的引用(即使不可变), 对应的,甚至可以用来声明一些!Sync的变量;

https://doc.rust-lang.org/stable/reference/items/static-items.html#mutable-statics

作者 Hello World 2023-08-19 17:32

看起来确实是对 static 有不同处理,但我也没在 reference 里看到有提到这个

Why does the borrowing checker not work for static item?

--
👇
Pikachu: 不单纯是unsafe的原因。把static换成let之后,即使有unsafe也会报错。

这里应该是编译器对static做了特殊处理,但是我翻了reference没找到更具体的说明。

--
👇
GUO: 因为你用了 unsafe

Pikachu 2023-08-19 15:30

不单纯是unsafe的原因。把static换成let之后,即使有unsafe也会报错。

这里应该是编译器对static做了特殊处理,但是我翻了reference没找到更具体的说明。

--
👇
GUO: 因为你用了 unsafe

GUO 2023-08-19 14:46

因为你用了 unsafe

1 共 4 条评论, 1 页