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



请参考下面的代码,查找已注释掉的行。它不能由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;
}

Rust的早期版本(1.0之前(使用*T作为const原始指针(与您注意到的语法相同,现在不起作用(。RFC 0068将*T重命名为*const T,理由是当从现有的C代码转录类型签名时,使用*T更容易出错

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

RFC还注意到(正如您所做的(这在引用和原始指针之间的命名中引入了不一致:

今天的不安全指针设计与Rust中借用的指针类型一致,对可变指针使用mut限定符,而对"没有限定符;不可变的";指针。重命名指针会偏离这种一致性,还会引入该语言中其他地方没有使用的关键字const

最新更新