title: Operator overloading by value results in use of moved value
body: <p>Compiling the following Rust code that uses operator overloading</p>
  
  <pre><code>use std::ops::{Add};
  
  #[derive(Show)]
  struct Point {
      x: int,
      y: int
  }
  
  impl Add for Point {
      type Output = Point;
  
      fn add(self, other: Point) -&gt; Point {
          Point {x: self.x + other.x, y: self.y + other.y}
      }
  }
  
  fn main() {
      let p: Point = Point {x: 1, y: 0};
      let pp = p + p;
  }
  </code></pre>
  
  <p>Results in compiler errors due to ownership of p:</p>
  
  <pre><code>&lt;anon&gt;:21:18: 21:19 error: use of moved value: `p`
  &lt;anon&gt;:21     let pp = p + p;
                             ^
  &lt;anon&gt;:21:14: 21:15 note: `p` moved here because it has type `Point`, which is non-copyable
  &lt;anon&gt;:21     let pp = p + p;
                         ^
  </code></pre>
  
  <p>The rationale behind it is explained <a href="https://mail.mozilla.org/pipermail/rust-dev/2014-June/010280.html" rel="noreferrer">here</a> and led to an <a href="https://github.com/rust-lang/rfcs/pull/118" rel="noreferrer">RFC</a> that was not accepted (part of due to reasons of the above example). However, later the following <a href="https://github.com/rust-lang/rfcs/pull/439" rel="noreferrer">RFC</a> still introduced the by-value type signatures for operators.</p>
  
  <p>While I understand the rationale behind the decision. Due to my lack of experience in rust, I'm not sure what the "proper" way would be to allow the above code to work (a) if I do not want to copy or (b) how to make the struct copyable?</p>