title: Why std::make_move_iterator works on vector<string> but not on vector<int>
body: <p>I was expecting that <code>std::make_move_iterator</code> will always <em>move</em> contents, but it seems not.</p>
  
  <p>It looks like it is moving elements in <code>vector&lt;string&gt;</code> but not in <code>vector&lt;int&gt;</code>.</p>
  
  <p>See the below code snippet:</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;iterator&gt;
  #include &lt;string&gt;
  #include &lt;vector&gt;
  
  void moveIntVector()
  {
    std::cout &lt;&lt; __func__ &lt;&lt; std::endl;
    std::vector&lt;int&gt; v1;
    for (unsigned i = 0; i &lt; 10; ++i) {
      v1.push_back(i);
    }
    std::vector&lt;int&gt; v2(
      std::make_move_iterator(v1.begin() + 5),
      std::make_move_iterator(v1.end()));
    std::cout &lt;&lt; "v1 is: ";
    for (auto i : v1) {
      std::cout &lt;&lt; i &lt;&lt; " ";
    }
    std::cout &lt;&lt; std::endl;
  
    std::cout &lt;&lt; "v2 is: ";
    for (auto i : v2) {
      std::cout &lt;&lt; i &lt;&lt; " ";
    }
    std::cout &lt;&lt; std::endl;
  }
  
  void moveStringVector()
  {
    std::cout &lt;&lt; __func__ &lt;&lt; std::endl;
    std::vector&lt;std::string&gt; v1;
    for (unsigned i = 0; i &lt; 10; ++i) {
      v1.push_back(std::to_string(i));
    }
    std::vector&lt;std::string&gt; v2(
      std::make_move_iterator(v1.begin() + 5),
      std::make_move_iterator(v1.end()));
    std::cout &lt;&lt; "v1 is: ";
    for (auto i : v1) {
      std::cout &lt;&lt; i &lt;&lt; " ";
    }
    std::cout &lt;&lt; std::endl;
  
    std::cout &lt;&lt; "v2 is: ";
    for (auto i : v2) {
      std::cout &lt;&lt; i &lt;&lt; " ";
    }
    std::cout &lt;&lt; std::endl;
  }
  
  int main()
  {
    moveIntVector();
    moveStringVector();
    return 0;
  }
  </code></pre>
  
  <p>The result is:</p>
  
  <pre><code>moveIntVector
  v1 is: 0 1 2 3 4 5 6 7 8 9  # I expect this should be `0 1 2 3 4` as well!
  v2 is: 5 6 7 8 9 
  moveStringVector
  v1 is: 0 1 2 3 4      
  v2 is: 5 6 7 8 9 
  </code></pre>
  
  <p>I'm on <code>Ubuntu 14.04, gcc 4.8.2</code> and the code is compiled with <code>-std=c++11</code></p>
  
  <p>Could you explain why <code>std::make_move_iterator</code> have different behaviour on <code>vector&lt;int&gt;</code> and <code>vector&lt;string&gt;</code>? (Or is it a bug?)</p>