rust - 为什么`const`上的可变引用不是错误?
问题描述
由于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 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;
}
与首先添加本地绑定相比,我无法立即想到这样做是有益的。但它不会导致内存不安全,因此不必担心。
鉴于这在 Rust 1.0 版本中不是错误,Rust 开发人员以后不能让它成为错误,因为这会破坏向后兼容性。
推荐阅读
- c# - 下载存储在服务器文件夹中的空白 Excel 电子表格
- c# - 无法从 System.Windows.Forms.DialogResult 转换为“字符串”C#
- c++ - 结构中的 char[] 到 char*
- r - 如何使用 for 循环在 R 中构造具有模块化模式的矩阵?
- c - Arduino - 不使用延迟()的 PIR 运动传感器代码
- java - Spring Cloud Gateway + Spring 安全资源服务器
- asp.net - 错误:SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.0 Authentication Required
- android - Android表格布局:边框?
- node.js - nock 有什么办法可以和 puppeteer 一起工作吗
- java - ListView 仅在我旋转手机时显示数据