【发布时间】:2019-09-04 00:00:45
【问题描述】:
我正在编写一些不安全的 Rust 代码,所以我需要知道 *const T 和 *mut T 之间的确切区别。我假设它就像&T 和&mut T (即你不能通过&T 改变T,句号),但事实并非如此!
例如,指针包装器NonNull<T>定义如下(source):
pub struct NonNull<T: ?Sized> {
pointer: *const T,
}
但是,可以通过as_ptr 从此包装器中获取*mut T,它的定义为:
pub const fn as_ptr(self) -> *mut T {
self.pointer as *mut T
}
该功能甚至没有标记为unsafe!我不允许从&T 转换为&mut T(有充分的理由!),但显然这样的转换指针很好。
The Nomicon 在the chapter about variance 中提到*const T 和*mut T 的方差不同:
*const T: 协变*mut T:不变
这是指针类型之间的唯一区别吗?这对我来说似乎很奇怪......
指针类型之间到底有什么区别? *const T 有没有 *mut T 没有的限制?如果差异很小:在语言中包含这两种指针类型的其他原因是什么?
【问题讨论】:
-
@trentcl 这很有帮助,谢谢!但我不认为它完全回答了我的问题。一方面,这个答案根本没有提到差异(我肯定知道一件事在这里是相关的)。我觉得您链接的答案绝对应该与回答此问题的答案相关联。但是,是的,我认为它不能完全回答这个问题。
-
一方面,您不能分配给
*const T的取消引用。