gpt4 book ai didi

rust - 自动解引用和解引用强制之间有什么关系?

转载 作者:行者123 更新时间:2023-11-29 07:44:34 33 4
gpt4 key购买 nike

经过一些discussion , 我现在对 auto-dereferencing 之间的关系有点困惑和 deref coercion .

It seems术语“自动取消引用”仅适用于取消引用的目标是方法接收器时,而it seems术语“deref 强制”适用于函数参数及其需要的所有上下文。

我认为取消引用并不总是涉及取消引用强制,但我不确定:取消引用总是使用一些 Deref::deref 吗?特征实现?

如果是,是 T: Deref<Target = U> where T: &U 的实现者编译器内置?

最后,在编译器隐式转换 &&&&x 的所有情况下,使用术语“autoderef”听起来很自然。至 &x :

pub fn foo(_v: &str) -> bool {
false
}

let x="hello world";
foo(&&&&x);

这是社区的普遍共识吗?

最佳答案

这两个案例之间的相似之处相当肤浅。

在方法调用表达式中,编译器首先需要确定调用哪个方法。该决定基于接收器的类型。编译器构建了一个候选接收器类型列表,其中包括通过重复取消引用接收器获得的所有类型,还包括 &T&mut T适用于所有类型 T遭遇。这就是为什么您可以调用接收 &mut self 的方法的原因直接作为x.foo()而不是必须写 (&mut x).foo() .对于候选列表中的每个类型,编译器然后查找固有方法和可见特征的方法。查看language reference了解更多详情。

deref 强制转换非常不同。它只发生在编译器确切知道期望的类型的强制站点。如果遇到的实际类型与预期类型不同,编译器可以使用任何强制转换(包括 deref 强制转换)将实际类型转换为预期类型。可能的强制转换列表包括未定大小的强制转换、指针弱化和取消引用强制转换。见 chapter on coercions in the Nomicon了解更多详情。

因此,这实际上是两种截然不同的机制——一种用于寻找正确的方法,另一种用于在已知确切期望的类型时转换类型。第一种机制还会自动引用接收方,这在强制转换中永远不会发生。

I thought that a dereference does not always involve deref coercion, but I'm not sure: does dereferencing always use some Deref::deref trait implementation?

并非每个解引用都是解引用强制。如果你写 *x ,你明确取消引用x .相反,deref 强制转换 由编译器隐式执行,并且仅在编译器知道预期类型的​​地方执行。

semantics of dereferencing取决于 x 的类型是指针类型,即引用或原始指针,或者不是。对于指针类型,*x表示对象 x指向,而对于其他类型 *x相当于*Deref::deref(&x) (或者这个的可变类比)。

If so, is the implementor of T: Deref<Target = U> where T: &U built into the compiler?

我不太确定你的语法应该是什么意思——它肯定不是有效的 Rust 语法——但我猜你是在问是否取消引用 &T 的实例。至 T内置于编译器中。如上所述,指针类型的取消引用(包括引用)内置于编译器中,但也有一个 blanket implementation of Deref for &T 。在标准库中。这个一揽子实现对泛型代码很有用——特征边界 T: Deref<Target = U>否则不允许 T = &U .

关于rust - 自动解引用和解引用强制之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53341819/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com