
[英]Why do we need Rc<T> when immutable references can do the job?
[英]Why do raw pointers need the const keyword when references don't?
请参考下面的代码,以获取已注释掉的行。 它不能被 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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.