gpt4 book ai didi

rust - 为什么 `const` 上的可变引用不是错误?

转载 作者:行者123 更新时间:2023-12-03 11:27:14 24 4
gpt4 key购买 nike

由于Rust book v1.30明确地说:

... constants in Rust have no fixed address in memory. This is because they’re effectively inlined to each place that they’re used. References to the same constant are not necessarily guaranteed to refer to the same memory address for this reason.


为什么编译器允许获得 可变引用 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
}
Rust playground
正如所料, const 的内存位置可能会改变(特别是在使用可变引用访问时)。

最佳答案

在某些情况下,它的行为是可预测的。特别是,如果您重复使用相同的引用:

const VALUE: u64 = 0;

fn main() {
let v = &mut VALUE;
add_1(v);
add_1(v);
assert_eq!(*v, 2);
}

fn add_1(v: &mut u64) {
*v += 1;
}
与首先添加本地绑定(bind)相比,我无法立即想到这样做是有益的。但它不会导致内存不安全,因此不必担心。
鉴于这在 Rust 1.0 版本中不是错误,Rust 开发人员以后不能让它成为错误,因为这会破坏向后兼容性。

关于rust - 为什么 `const` 上的可变引用不是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66566058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com