As @blake2-ppc pointed out in IRC, the traits actually behave as if it was just borrowed to `a.add(&b)`.

Demonstration:

```rust
struct Foo;
impl<'self> Add<Foo, Foo> for &'self Foo {
    fn add(&self, _; &Foo) -> Foo { Foo }
}
fn main() {
    Foo + Foo; // this doesn't work, but *would* work if it desugared to (&Foo).add(&Foo)
}
```