我正在编写一些不安全的Rust代码,所以我需要知道
例如,指针包装器
该函数甚至未被标记为
Nomicon在有关变异的章节中提到:*const T和
指针类型之间到底有哪些差异?
*const T
和*mut T
之间的确切区别。我认为它就像&T
和&mut T
一样(即你只是不能通过&T
修改T
),但事实并非如此!例如,指针包装器
NonNull<T>
的定义如下(源代码见这里):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在有关变异的章节中提到:*const T和
*mut T
在变异上存在差异:
这是指针类型之间的唯一区别吗?这对我来说听起来很奇怪…
*const T
:协变*mut T
:不变
指针类型之间到底有哪些差异?
*const T
是否有*mut T
没有的限制?如果差异很小:使用语言中的两种指针类型的其他原因是什么?
*const T
的反引用。 - Francis Gagné