对于已注释掉的行,请参考下面的代码。它不能被 Rust 编译器编译,这意味着我们需要为*const i32
Rust 中的原始指针显式指定常量。但是对于对其指针对象不可变的引用,我们不需要像使用原始指针那样显式指定常量。那么,为什么 Rust 不使用更对称的方式来表达引用和原始指针的相同含义,因为引用实际上是引擎盖下的指针?
fn main() {
let x1: &i32;
let x2: &mut i32;
// let p1: *i32; // This line doesn't compile!!!
let p1: *const i32; // we need to specify the constness explicitly.
let p2: *mut i32;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
*T
用于const
原始指针的早期版本的 Rust(1.0 之前)(与您注意到的相同语法今天不起作用)。RFC 0068重命名*T
为*const T
,理由是*T
在从现有 C 代码转录类型签名时使用它更容易出错:
Rust 不安全指针类型与 C 指针类型的当前差异被证明太容易出错,无法在未来实际启用这些优化。通过重命名 Rust 的不安全指针以与它们的 C 兄弟紧密匹配,错误转录签名的可能性降低了。
RFC 还指出(正如您所做的那样),这会导致引用和原始指针之间的命名不一致:
今天的不安全指针设计与 Rust 中借用的指针类型一致,使用
mut
限定符表示可变指针,不使用限定符表示“不可变”指针。重命名指针将与这种一致性背道而驰,并且还会引入一个未在语言其他地方使用的关键字const
.