为什么 deref 强制转换不适用于 `From::from`?

2023-11-29

来自section在书里:

Deref 强制转换将引用转换为实现Deref特征转换为对另一种类型的引用。它会自动发生 当我们传递对特定类型值的引用作为参数时 与参数类型不匹配的函数或方法 函数或方法定义。

我正在尝试找出两者之间的区别bar and From::from在下面的代码中,这意味着一个可以编译,另一个则不能。

struct T;
struct U;
struct W;

impl From<&U> for T {
    fn from(u: &U) -> T { T }
}

impl std::ops::Deref for W {
    type Target = U;
    fn deref(&self) -> &U {
       &U 
    }
}

fn foo(_: T) {}
fn bar(_: &U) {}

fn main() {
   let w = &W; 
   foo(T::from(w)); // error. "trait bound `T: From<&W>` not satisfied"
//   bar(w); // okay
}

如果我明确输入,我可以编译它From::<&U>::from(w)。但我没想到必须这样做。即使有多个From的实现T,一个类型只能deref()转换为一种类型,因此编译器是否只有一个选项,尝试并取消引用传递的类型,然后查看是否From目标是否存在实施?


不同之处在于bar是一个具体函数,而T::from不是,它是该特征的任何实现之一。编译器首先必须找到正确的实现。但它发现From<&U>没有实施。然后它就放弃了。

这里甚至没有尝试取消引用强制转换,因为编译器这样做的情况都不适用。

我们还没有函数⇒我们没有目标类型⇒我们无法“匹配函数或方法定义中的参数类型”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 deref 强制转换不适用于 `From::from`? 的相关文章

随机推荐