Rust 为什么指向同一分配的两个引用计数器不相等?

Rust 为什么指向同一分配的两个引用计数器不相等?,rust,Rust,我最近在以下方面遇到了这种情况: 根据定义,指向内存中相同位置的两个指针肯定是相等的(因为它们是相同的值)?如果两个值仅为PartialEq而不是Eq?的话,为什么会出现这种情况呢?因为并非所有的值都等于它们自己NaN。Rust的指针比较不比较指针,而是比较指向的值。这是&T,&mut T,框,Rc,弧等的情况,除了原始指针*const T和*mut本身之外,其他所有指针都是这样。这些智能指针通常有一个额外的方法(在本例中)用于实际指针比较 这类似于那些指针上的Debug如何打印指向的值而不是地

我最近在以下方面遇到了这种情况:


根据定义,指向内存中相同位置的两个指针肯定是相等的(因为它们是相同的值)?如果两个值仅为
PartialEq
而不是
Eq

的话,为什么会出现这种情况呢?因为并非所有的值都等于它们自己<例如,code>NaN。

Rust的指针比较不比较指针,而是比较指向的值。这是
&T
&mut T
Rc
等的情况,除了原始指针
*const T
*mut
本身之外,其他所有指针都是这样。这些智能指针通常有一个额外的方法(在本例中)用于实际指针比较

这类似于那些指针上的
Debug
如何打印指向的值而不是地址,并且您需要
指针
特性来打印实际地址:Rust不是非常关注地址

现在,如果您有一个类型,如
f64
,它没有可传递的
=
(即,它实现
PartialEq
,但不实现
Eq
),并将其包装在
Rc
中,那么您也会得到非可传递性:

fn main(){
设a=std::rc::rc::new(std::f64::NAN);
println!(“a==a?:{},a==a);
普林顿(
“a==a但具有指针比较?:{}”,
标准::rc::rc::ptr_eq(&a,&a)
);
//但是:
让答案=std::rc::rc::new(42);
//这肯定会有不同的地址
让另一个答案=std::rc::rc::new(42);
println!(“答案==另一个答案:{}”,答案==另一个答案);
}
印刷品:

a==a?:false
a==a但有指针比较?:true
答案==另一个答案?:正确
如果
T
碰巧实现了
Eq
以及
PartialEq
,那么当前的实现确实会使用尚未稳定的专门化功能进行指针比较

另见:

可能相关:另见。
/// If `T` also implements `Eq` (implying reflexivity of equality),
/// two `Rc`s that point to the same allocation are
/// never unequal.