2014-12-02 3 views
3

나는이 정상인지 궁금 동안 재귀 한계에 도달하거나 버그입니다 :오류 : 자동 역 참조 T

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.add(&b)에 해당하는 설탕으로만 생각하는 a+b입니까?

답변

5

짧은 버전 : a + b 꽤 같은 a.add(&b)하지 때문에TDeref<T> 구현은, 물건을 불면 메서드 호출 및 운영자 호출이 왼쪽을 역 참조와 관련하여 작동하는 방식에 아무 의미 등의 차이를하지 않습니다 .

긴 버전 :

+ 연산자와 Add.add가 멀리 참조 복용에 관한 한 서로 다르게 작동합니다.

+ 오퍼레이터은 두 피연산자를 모두 참조로 사용합니다. AB의 피연산자에 대한 a + bA에 대해 Add<B, C>의 구현이 있어야하며 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을 참조하십시오. 게다가 TDeref<T>을 구현하므로 T으로 역 참조합니다. 재귀 한계에 도달 할 때까지이 작업을 계속합니다. 실제로 T을 구현하면 Deref<T>은 전혀 이해가되지 않습니다. 당신의 명확한 설명을위한

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) 
+0

감사 :

는 비교를 위해, 여기에 메소드 호출이 작품을 추가하는 방법에 대한 몇 가지 데모입니다!나는 deref 특성을 추가했다. T가 (코드에서 다른 오류를 수정하기 위해) 역 참조 될 수 있다는 것을 의미한다고 생각했는데, 이것이 실제로 의미하는 바가 아니다. 그러나'a + b'와'a.add (& b)'의 차이에 대한 설명이 필요했습니다. – BigEpsilon