我正在写一些不安全的防 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
(这是一个很好的理由!),但很明显,像这样投球是可以的.
Nomicon在the chapter about variance中提到*const T
和*mut T
的方差不同:
*const T
:协变*mut T
:不变量
这是指针类型之间唯一的区别吗?这对我来说似乎很奇怪...
What exactly are the differences between the pointer types? *mut T
没有*const T
的限制吗?如果差异很小:在语言中包含这两种指针类型的其他原因是什么?