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

时间:2021-04-18 06:53:23

标签: rust

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

1 个答案:

答案 0 :(得分:5)

Rust 的早期版本(1.0 之前)使用 docker run -v /mnt/app/files/Images/vehicle:/YOUR_LOCAL_PATH imageName 表示 *T 原始指针(与您注意的相同语法今天不起作用)。 RFC 0068const 重命名为 *T,理由是在从现有 C 代码转录类型签名时使用 *const T 更容易出错:

<块引用>

Rust 不安全指针类型与 C 指针类型的当前差异被证明太容易出错,无法在未来实际启用这些优化。通过重命名 Rust 的不安全指针以与其 C 兄弟紧密匹配,错误转录签名的可能性降低了。

RFC 还指出(正如您所做的那样)这会导致引用和原始指针之间的命名不一致:

<块引用>

今天的不安全指针设计与 Rust 中的借用指针类型一致,对可变指针使用 *T 限定符,对“不可变”指针使用无限定符。重命名指针将与这种一致性背道而驰,并且还会引入一个未在语言其他地方使用的关键字 mut

相关问题