title: Why does the usage of by_ref().take() differ between the Iterator and Read traits?
body: <p>Here are two functions:</p>
  
  <pre><code>fn foo&lt;I&gt;(iter: &amp;mut I)
  where
      I: std::iter::Iterator&lt;Item = u8&gt;,
  {
      let x = iter.by_ref();
      let y = x.take(2);
  }
  
  fn bar&lt;I&gt;(iter: &amp;mut I)
  where
      I: std::io::Read,
  {
      let x = iter.by_ref();
      let y = x.take(2);
  }
  </code></pre>
  
  <p>While the first compiles fine, the second gives the compilation error:</p>
  
  <pre class="lang-none prettyprint-override"><code>error[E0507]: cannot move out of borrowed content
    --&gt; src/lib.rs:14:13
     |
  14 |     let y = x.take(2);
     |             ^ cannot move out of borrowed content
  </code></pre>
  
  <p>The signatures of <code>by_ref</code> and <code>take</code> are almost identical in <code>std::iter::Iterator</code> and <code>std::io::Read</code> traits, so I supposed that if the first one compiles, the second will compile too. Where am I mistaken?</p>