title: Can a value be moved by taking a mutable reference?
body: <p><a href="https://play.rust-lang.org/?gist=82132ae019215582e5d2eae28b70c9a5&amp;version=nightly&amp;backtrace=0" rel="nofollow">Playpen</a></p>
  
  <pre><code>pub trait Skip&lt;I: Iterator&gt; {
      fn skip(&amp;mut self, steps: usize);
  }
  
  impl&lt;I: Iterator&gt; Skip&lt;I&gt; for I {
      fn skip(&amp;mut self, mut steps: usize) {
          for _ in self {
              steps -= 1;
              if steps &lt;= 0 {
                  break;
              }
          }
      }
  }
  
  fn main() {
      let s  = "abc123def";
      let mut chars = s.chars();
      chars.skip(2);
      println!("{:?}", chars.collect::&lt;String&gt;());
  }
  </code></pre>
  
  <p>Error:</p>
  
  <pre class="lang-none prettyprint-override"><code>error: use of moved value: `chars` [--explain E0382]
    --&gt; &lt;anon&gt;:20:22
  19 |&gt;     chars.skip(2);
     |&gt;     ----- value moved here
  20 |&gt;     println!("{:?}", chars.collect::&lt;String&gt;());
     |&gt;                      ^^^^^ value used here after move
  &lt;anon&gt;:20:22: 20:27: note: in this expansion of format_args!
  &lt;anon&gt;:20:22: 20:27: note: in this expansion of print! (defined in &lt;std macros&gt;)
  &lt;anon&gt;:20:22: 20:27: note: in this expansion of println! (defined in &lt;std macros&gt;)
  note: move occurs because `chars` has type `std::str::Chars&lt;'_&gt;`, which does not implement the `Copy` trait
  
  error: aborting due to previous error
  playpen: application terminated with error code 101
  </code></pre>