当引用不需要时,为什么原始指针需要 const 关键字?

YHS*_*SPY 5 rust

对于已注释掉的行,请参考下面的代码。它不能被 Rust 编译器编译,这意味着我们需要为*const i32Rust 中的原始指针显式指定常量。但是对于对其指针对象不可变的引用,我们不需要像使用原始指针那样显式指定常量。那么,为什么 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.