【发布时间】:2021-03-10 13:47:48
【问题描述】:
由于Rust book v1.30 明确表示:
... Rust 中的常量在内存中没有固定地址。这是因为它们有效地内联到使用它们的每个地方。因此,对相同常量的引用不一定保证引用相同的内存地址。
为什么编译器允许在const 变量上获得可变引用。它只是说的是警告/注释而不是错误。
warning: taking a mutable reference to a `const` item
--> src/main.rs:5:22
|
6 | println!("{:p}", &mut VALUE);
| ^^^^^^^^^^
|
= note: `#[warn(const_item_mutation)]` on by default
= note: each usage of a `const` item creates a new temporary
= note: the mutable reference will refer to this temporary, not the original `const` item
为了测试这一点,一个简单的代码示例:
fn main() {
const VALUE: u64 = 0;
println!("{:p}", &VALUE); // 0x10622ed78 // same
println!("{:p}", &VALUE); // 0x10622ed78
println!("{:p}", &mut VALUE); // 0x7ffee9a08890 // different
println!("{:p}", &mut VALUE); // 0x7ffee9a088e8
}
正如预期的那样,const 的内存位置可能会改变(特别是在使用可变引用访问时)。
【问题讨论】:
-
我认为警告很清楚发生了什么。您没有得到对
const变量的可变引用,const变量的内存位置也没有改变。您正在做的是创建许多不同的临时对象,它们是从VALUE复制的,并且这些临时对象的地址不同。如果您将VALUE替换为(1+2)之类的东西,也会发生同样的事情,println!("{:p}", &mut (1+2));也是如此 -
如果你认为像
&mut 1这样的东西是完全允许的(有时非常有用!),没有充分的理由不允许&mut FOO其中FOO是,比如说,1。但是事实证明,大多数&mut FOO实际上都是错误的,这就是引入警告的原因。
标签: rust