gpt4 book ai didi

rust - 错误 : reached the recursion limit while auto-dereferencing T

转载 作者:行者123 更新时间:2023-11-29 07:58:23 25 4
gpt4 key购买 nike

我想知道这是正常现象还是错误:

struct A<T> (T);

impl<T> Add<A<T>, A<T>> for A<T>
where T: Add<T, T> + Deref<T> + Copy {
fn add(&self, &A(b): &A<T>) -> A<T> {
let A(a) = *self;
A(a.add(&b))
}
}

产生这个错误:

<anon>:7:11: 7:12 error: reached the recursion limit while auto-dereferencing T [E0055]
<anon>:7 A(a.add(&b))

a+b 替换 a.add(&b) 编译没有错误

playpen

难道 a+b 不应该只是 a.add(&b) 的糖吗?

最佳答案

简短版: T实现 Deref<T>没有任何意义,因此方法调用和运算符调用在取消引用左侧方面的工作方式的差异会把事情搞砸,因为 a + ba.add(&b) 完全相同 .

长版:

+运算符和 Add.add 就引用而言,操作方式不同。

+ operator 通过引用本身获取两个操作数。 a + b对于各种类型的操作数 AB要求有 Add<B, C> 的实现对于 A并将产生一个 C 类型的值.如前所述,ab被引用;它自己默默地引用这些内容;没有猜测。它们的工作原理如下:

let a = 1i;
let b = a + a; // this one works
let c = a + &a; // mismatched types: expected `int`, found `&int` (expected int, found &-ptr)
let d = &a + a; // binary operation `+` cannot be applied to type `&int`
let e = &a + &a; // binary operation `+` cannot be applied to type `&int`

在任何情况下都不会发生取消引用,因此狡猾的 T: Deref<T>要求不会破坏任何东西。

Add.add 通过引用获取这两个值。作为常规函数调用,它具有在必要时自动取消引用和引用左侧的能力。虽然右侧作为方法参数按原样传入,但左侧尽可能取消引用以找到可能由 add 表示的所有可能方法。 .通常这很好,它会做你想做的,但在这种情况下它不会,因为 T (类型 a 是)实现 Deref<T> .所以取消引用会得到一个 T .然后T , 实现 Deref<T> , 取消对 T 的引用.更重要的是,T工具 Deref<T>所以取消对 T 的引用.它一直这样做,直到达到递归限制。真的,T实现 Deref<T>完全没有意义。

为了比较,下面是方法调用 add 如何工作的一些演示:

let a = 1i;
let b = a.add(a); // mismatched types: expected `&int`, found `int` (expected &-ptr, found int)
let c = a.add(&a); // this one works (a reference to the LHS is taken automatically)
let d = (&a).add(a); // mismatched types: expected `&int`, found `int` (expected &-ptr, found int)
let e = (&a).add(&a); // this one works (LHS is dereferenced and then rereferenced)

关于rust - 错误 : reached the recursion limit while auto-dereferencing T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260590/

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